Неоднозначная ссылка на "индекс" участника в словаре
Я пытаюсь создать отказоустойчивый инициализатор для класса. Мой класс будет инициализирован с использованием ввода из сетевого запроса. Сети ненадежны, я хочу создать инициализатор для проверки наличия на всех свойствах, и для этого в противном случае не будет.
Я пытаюсь использовать здесь охрану, поэтому, пожалуйста, не стесняйтесь указывать на очевидные ошибки в подходе:
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'
Любые идеи о том, как исправить эту ошибку?
Ответы
Ответ 1
guard требует условия, которые соответствуют BooleanType. Простое назначение - нет. Вам понадобится что-то вроде этого.
guard let j = job["jobid"] as? String else {
throw InitializationError.MissingJobId
}
self.jobId = j
Однако тогда вы получите сообщение об ошибке: "все хранимые свойства экземпляра класса должны быть инициализированы перед тем, как выбраться из инициализатора". Это ожидается и задокументировано на языке Swift Programming:
Для классов, однако, неудачный инициализатор может инициировать сбой инициализации только после того, как все сохраненные свойства, введенные этот класс был установлен на начальное значение и любой инициализатор делегация имела место.
Chris Lattner упоминает, что текущее поведение здесь нежелательно: http://swift-language.2336117.n4.nabble.com/Swift-2-throwing-in-initializers-td439.html