无法在 'self' 错误中分配给 'parameters' - 来自 CS193p 斯坦福在线课程
Cannot assign to 'parameters' in 'self' error - from CS193p Stanford Online Course
我目前正在开发可在此处下载的 Smashtag 应用程序:http://web.stanford.edu/class/cs193p/cgi-bin/drupal/
我一直在关注 iTunes U 视频(YouTube link:https://www.youtube.com/watch?v=ZIwaIEfPAh8&spfreload=10),但我无法克服我遇到的错误。
即使从斯坦福网站下载了应用程序的最终副本后,我仍然看到这些 Swift 编译器错误。
它继续说 Cannot assign to 'parameters' in 'self'
这会不会是 Xcode 在 February/March 2015 年发布此 Smashtag 应用程序学习课程后更新到 6.3?
感谢您的帮助,目前还不确定如何解决。
private var twitterAccount: ACAccount?
public class TwitterRequest
{
public let requestType: String
public let parameters = Dictionary<String, String>()
// designated initializer
public init(_ requestType: String, _ parameters: Dictionary<String, String> = [:]) {
self.requestType = requestType
**self.parameters = parameters**
}
// convenience initializer for creating a TwitterRequest that is a search for Tweets
public convenience init(search: String, count: Int = 0, _ resultType: SearchResultType = .Mixed, _ region: CLCircularRegion? = nil) {
var parameters = [TwitterKey.Query : search]
if count > 0 {
parameters[TwitterKey.Count] = "\(count)"
}
switch resultType {
case .Recent: parameters[TwitterKey.ResultType] = TwitterKey.ResultTypeRecent
case .Popular: parameters[TwitterKey.ResultType] = TwitterKey.ResultTypePopular
default: break
}
if let geocode = region {
parameters[TwitterKey.Geocode] = "\(geocode.center.latitude),\(geocode.center.longitude),\(geocode.radius/1000.0)km"
}
self.init(TwitterKey.SearchForTweets, parameters)
}
public enum SearchResultType {
case Mixed
case Recent
case Popular
}
从 Swift 1.2 开始,给常量变量一个初始值(不在 init
中)意味着它们不能在 init
中重新分配一个值。因此,因为您将 parameters
的初始值设置为一个空字典,所以您不能在 init
中为 parameters
赋予新值。要解决此问题,请将您的代码更改为:
public class TwitterRequest {
public let requestType: String
// Note - now we just define the type here.
public let parameters: Dictionary<String, String>
public init(_ requestType: String, _ parameters: Dictionary<String, String> = [:]) {
self.requestType = requestType
self.parameters = parameters
}
// Other stuff
}
或者,您可以将 parameters
更改为 var
,正如@Thomas Kilian 在他的评论中指出的那样。但是,如果您不打算更改存储在 parameters
中的值,则将其声明为 let
并使用上面的代码更有意义。
我目前正在开发可在此处下载的 Smashtag 应用程序:http://web.stanford.edu/class/cs193p/cgi-bin/drupal/
我一直在关注 iTunes U 视频(YouTube link:https://www.youtube.com/watch?v=ZIwaIEfPAh8&spfreload=10),但我无法克服我遇到的错误。
即使从斯坦福网站下载了应用程序的最终副本后,我仍然看到这些 Swift 编译器错误。
它继续说 Cannot assign to 'parameters' in 'self'
这会不会是 Xcode 在 February/March 2015 年发布此 Smashtag 应用程序学习课程后更新到 6.3?
感谢您的帮助,目前还不确定如何解决。
private var twitterAccount: ACAccount?
public class TwitterRequest
{
public let requestType: String
public let parameters = Dictionary<String, String>()
// designated initializer
public init(_ requestType: String, _ parameters: Dictionary<String, String> = [:]) {
self.requestType = requestType
**self.parameters = parameters**
}
// convenience initializer for creating a TwitterRequest that is a search for Tweets
public convenience init(search: String, count: Int = 0, _ resultType: SearchResultType = .Mixed, _ region: CLCircularRegion? = nil) {
var parameters = [TwitterKey.Query : search]
if count > 0 {
parameters[TwitterKey.Count] = "\(count)"
}
switch resultType {
case .Recent: parameters[TwitterKey.ResultType] = TwitterKey.ResultTypeRecent
case .Popular: parameters[TwitterKey.ResultType] = TwitterKey.ResultTypePopular
default: break
}
if let geocode = region {
parameters[TwitterKey.Geocode] = "\(geocode.center.latitude),\(geocode.center.longitude),\(geocode.radius/1000.0)km"
}
self.init(TwitterKey.SearchForTweets, parameters)
}
public enum SearchResultType {
case Mixed
case Recent
case Popular
}
从 Swift 1.2 开始,给常量变量一个初始值(不在 init
中)意味着它们不能在 init
中重新分配一个值。因此,因为您将 parameters
的初始值设置为一个空字典,所以您不能在 init
中为 parameters
赋予新值。要解决此问题,请将您的代码更改为:
public class TwitterRequest {
public let requestType: String
// Note - now we just define the type here.
public let parameters: Dictionary<String, String>
public init(_ requestType: String, _ parameters: Dictionary<String, String> = [:]) {
self.requestType = requestType
self.parameters = parameters
}
// Other stuff
}
或者,您可以将 parameters
更改为 var
,正如@Thomas Kilian 在他的评论中指出的那样。但是,如果您不打算更改存储在 parameters
中的值,则将其声明为 let
并使用上面的代码更有意义。