Подтвердить что ты не робот

Неоднозначная ссылка на "индекс" участника в словаре

Я пытаюсь создать отказоустойчивый инициализатор для класса. Мой класс будет инициализирован с использованием ввода из сетевого запроса. Сети ненадежны, я хочу создать инициализатор для проверки наличия на всех свойствах, и для этого в противном случае не будет.

Я пытаюсь использовать здесь охрану, поэтому, пожалуйста, не стесняйтесь указывать на очевидные ошибки в подходе:

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'

Любые идеи о том, как исправить эту ошибку?

4b9b3361

Ответ 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