2015-11-13 2 views
11

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

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

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

Вы хотите * * (неудачу т.е. возвращение 'nil') или * бросок * ошибка, если свойство отсутствует? Это две разные вещи. –

+1

Сообщение об ошибке, похоже, вводит в заблуждение: выражение после инструкции 'guard' должно иметь логический результат или результат оценки необязательной привязки (синтаксис' let'). Рассмотрите возможность проверки входного словаря * перед * вызовом инициализатора. – vadian

+0

@MartinR, я бы предпочел выбросить ошибку, поскольку вызывающий элемент инициализатора будет знать, почему инициализация не удалась, контекст, который вызывающий абонент не получит, вернув nil. –

ответ

8

Для защиты требуется условие, соответствующее BooleanType. Простое назначение - нет. Вам понадобится нечто подобное.

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

Однако, то вы получите сообщение об ошибке «все сохраненные свойства экземпляра класса должны быть инициализированы, прежде чем выбросить из инициализатора.» Это, как ожидается, и задокументированы в Свифта Язык программирования:

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.

Крис Латтнер упоминает текущее поведение нежелательно здесь: http://swift-language.2336117.n4.nabble.com/Swift-2-throwing-in-initializers-td439.html

Смежные вопросы