Ambiguous reference to member 'subscript' on Dictionary

匿名 (未验证) 提交于 2019-12-03 01:38:01

问题:

I am trying to create a failable initializer for a class. My class will be initialized using input from a network request. Networks being unreliable, I want to create an initializer the checks for the presence on all properties, and for it to fail otherwise.

I am trying to make use of guard here, so please feel free to point any obvious mistakes in the approach:

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

The guard self.jobId line is failing to compile, with error: Ambiguous reference to member 'subscript'

Any ideas on how to correct this error?

回答1:

guard requires a condition that conforms to BooleanType. Simple assignment doesn't. You would need something like this.

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

However, then you'll get the error "all stored properties of a class instance must be initialized before throwing from an initializer." This is expected and documented in the The Swift Programming Language:

For classes, however, a failable initializer can trigger an initialization failure only after all stored properties introduced by that class have been set to an initial value and any initializer delegation has taken place.

Chris Lattner mentions the current behavior is undesirable here: http://swift-language.2336117.n4.nabble.com/Swift-2-throwing-in-initializers-td439.html



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!