【发布时间】: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 关于这一点,在你的情况下,在创建实例之前验证输入会更方便。