我正在尝试为类创建一个可用的初始化程序。我的类将使用来自网络请求的输入进行初始化。网络不可靠,我想创建一个初始化程序,检查所有属性的存在,否则它将失败。
我试图在这里使用警卫,所以请随意指出方法中的任何明显错误:
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'
有关如何纠正此错误的任何想法?
答案 0 :(得分:8)
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