2015-12-22 4 views
1

У меня есть пользовательский класс, который я хочу, чтобы инициализировать из объекта JSON с помощью JSONCodable https://github.com/matthewcheok/JSONCodableОбработки неудачной инициализации в Swift

Так что я

public var id: String  
public var name: String? 
public var imageURL: NSURL? 

и failable Инициализатором, который соответствует протоколу JSONCodable

required public init?(JSONDictionary: JSONObject) { 
     let decoder = JSONDecoder(object: JSONDictionary) 
     do { 
      id = try decoder.decode("id") 
      name = try decoder.decode("name") 
      if let imageURLString: String = try decoder.decode("image") { 
       imageURL = NSURL(string: imageURLString) 
      } 
     } 
     catch let error as NSError{ 
      NSLog("\(error.localizedDescription)") 
      return nil 
     } 
    } 

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

+0

Если у вас есть только одно свойство для проверки (в соответствии с вашим именем проекта и изображениемURL может быть 'nil' в классе), я бы извлек' id' перед вызовом инициализатора и объявил инициализатор невоспроизводимым. – vadian

+0

Он должен быть несовместим с протоколом JSONCodable. Также этот пример является лишь доказательством концепции - у меня есть много других свойств для добавления. – primulaveris

+0

В этом случае вы должны назначить всем нефакульным свойствам значение по умолчанию, например пустую строку для свойства 'id' – vadian

ответ

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