2014-12-17 7 views
2

Я использую SwiftyJSON (https://github.com/SwiftyJSON/SwiftyJSON). Предположим, у меня есть ответ JSON одного из двух форматов:Каков наилучший способ обработки необязательного элемента в SwiftyJSON?

{ 
    "id": 1, 
    "foo": "bar" 
} 

Или

{ 
    "id": 1, 
    "foo": "bar", 
    "user": {"id": 2} 
} 

Я хочу обновить «пользователь» атрибут моего Свифта объекта только тогда, когда элемент «пользователь» в формате JSON является настоящее время. Сейчас я делаю это:

let userJson = json["user"] 
if userJson.type != .Null && userJson.type != .Unknown { 
    user = User.create(userJson) 
} 

Есть ли лучший способ справиться с этим? Скажем, используя синтаксис Swift's if-let?

ответ

2

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

Поскольку я знаю, что вызов API может либо возвращать плохой отклик какого-либо рода (обработанный в основном из моего уровня прокси), либо именно контракт, который мне нужен для этого вызова (преобразованный в DTO), я могу сделать некоторые предположения о том, что вернулся.

В вашем случае, когда у вас есть возможность что-то не возвращается, если это не сложный проект, который вы, вероятно, может сойти с рук делать те виды проверок, в конструкторе, как это:

required init(dict dictionary: NSDictionary) 
{ 
    self.id = dictionary["id"] as Int 
    self.foo = dictionary["foo"] as String 
    self.user = ((dictionary["user"] == nil) ? User() : User(dictionary["user"])) 
} 

Так что теперь здесь я говорю, что если nil возвращает новый пользовательский объект, но, возможно, вы хотите просто оставить его в ноль. В противном случае передайте «пользовательский словарь» (дочерний элемент вашего исходного JSON, в данном случае {«id»: 2}) в конструктор класса пользователя, и он в значительной степени сделает то же самое, но увлажнит ваш пользовательский объект ,

Я думаю, класс пользователей может быть:

required init(dict dictionary: NSDictionary) 
{ 
    self.id = (dictionary["id"] as Int) 
} 
+0

Спасибо, что поделились своим дизайном! – franklsf95

1

Поскольку SwiftyJSON позволяет использовать объекты, как будто они существуют (при условии, что идентификатор пользователя всегда существует, если объект пользователя возвращается), вы можете также использовать следующий как проверка, чтобы упростить вещи немного:

if let userId = json["user"]["id"].string { 
    user = User.create(json["user"]) 
} else { 
    // Do something else, or just ignore it. 
} 
+0

Это приятно! С немного взломать чувство, хотя :) – franklsf95

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

  • Нет связанных вопросов^_^