【问题标题】:Ambiguous reference to member 'subscript' on Dictionary对字典上成员“下标”的模棱两可的引用
【发布时间】:2015-11-13 09:53:49
【问题描述】:

我正在尝试为一个类创建一个可失败的初始化程序。我的课程将使用来自网络请求的输入进行初始化。网络不可靠,我想创建一个初始化程序来检查所有属性是否存在,否则它会失败。

我在这里尝试使用警卫,因此请随时指出该方法中的任何明显错误:

public class JobModel {
    let jobId: String
    let status: String
    let toName: String
    let toAddress: String
    let description: String
    let fee: Int
    let jobDate: NSDate
    let fromName: String
    let fromAddress: String

    init?(job: [String:AnyObject]) throws {
        guard self.jobId = job["jobid"] as! String else {
            throw InitializationError.MissingJobId
        }

    }
}

guard self.jobId 行编译失败,出现错误: Ambiguous reference to member 'subscript'

关于如何纠正这个错误的任何想法?

【问题讨论】:

  • 如果属性不存在,您要失败(即返回nil)还是抛出错误?这是两件不同的事情。
  • 错误信息似乎具有误导性:guard 语句之后的表达式必须具有布尔结果或可选绑定的评估结果(let 语法)。考虑在调用初始化程序之前验证输入字典。
  • @MartinR,我宁愿抛出一个错误,因为初始化程序的调用者会知道初始化失败的原因,调用者不会通过返回 nil 来获得上下文。
  • 类实例的所有存储属性必须在从初始化程序抛出之前初始化。所以我同意@vadian 关于这一点,在你的情况下,在创建实例之前验证输入会更方便。

标签: ios swift swift2


【解决方案1】:

guard 需要符合 BooleanType 的条件。简单的分配没有。你会需要这样的东西。

guard let j = job["jobid"] as? String else {
    throw InitializationError.MissingJobId
}
self.jobId = j

但是,您将收到错误消息“必须在从初始化程序抛出之前初始化类实例的所有存储属性。”这是预期的,并记录在 The Swift Programming Language 中:

然而,对于类,一个可失败的初始化器可以触发一个 仅在由 该类已设置为初始值和任何初始化程序 委托已发生。

Chris Lattner 在此提到当前的行为是不可取的:http://swift-language.2336117.n4.nabble.com/Swift-2-throwing-in-initializers-td439.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多