简体   繁体   中英

Ambiguous reference to member 'subscript' on Dictionary

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?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM