【问题标题】:Cannot assign to 'parameters' in 'self' error - from CS193p Stanford Online Course无法在“自我”错误中分配给“参数” - 来自 CS193p 斯坦福在线课程
【发布时间】:2015-04-21 21:39:52
【问题描述】:

我目前正在开发 Smashtag 应用程序,可以在这里下载:http://web.stanford.edu/class/cs193p/cgi-bin/drupal/

我一直在关注 iTunes U 视频(YouTube 链接:https://www.youtube.com/watch?v=ZIwaIEfPAh8&spfreload=10),但我无法克服遇到的错误。

即使在从斯坦福网站下载了应用程序的最终副本后,我仍然看到这些 Swift 编译器错误仍然弹出。

它继续说Cannot assignment to 'parameters' in 'self'

这可能是因为在 2015 年 2 月/3 月发布了这个 Smashtag 应用程序学习课程后 Xcode 更新到 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
    }

【问题讨论】:

  • 参数好像是let。让它var

标签: ios xcode swift cs193p


【解决方案1】:

从 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
}

正如@Thomas Kilian 在他的评论中指出的那样,您也可以将parameters 更改为var。但是,如果您不打算更改存储在 parameters 中的值,则将其声明为 let 并使用上面的代码更有意义。

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2020-09-13
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多