Я не могу придумать более элегантный способ, чем то, что вы делаете, но кроме того, что я сделал, это переместить мои проверки в конструкторе. То, что я делаю для моей реализации, - это каждый класс, который может десериализоваться для объекта передачи данных, я должен предоставить реализацию для конструктора, который принимает словарь в качестве параметра. Словарь - это 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)
}
Спасибо, что поделились своим дизайном! – franklsf95