initWithDictionary: в Objective-C и Swift

В Objective-C мы можем использовать сопоставление объектов с JSON-откликом следующим образом

 PolicyData *policyData = [[PolicyData alloc] initWithDictionary:responseObject error:&err];

Здесь мы можем сопоставить responseObject со свойствами класса PolicyData. Как я могу сделать то же самое в Swift?

2 ответа

Решение

Это должно быть так же просто, как добавление соединительного заголовка (потому что PolicyData скорее всего написано в Objective-C). Инструкции о том, как это сделать, можно увидеть в этой документации Apple.

Тогда вы можете создать это PolicyData возражать так же легко, как делать:

do {
    let newPolicyDataObject = try PolicyData(responseObject)
} catch error as NSError {
    print("error from PolicyData object - \(error.localizedDescription)")
}

Это предполагает ваш responseObject является NSDictionary. А Swift 2 услужливо (?) Превращает параметры ошибок в блоки try/catch.

То есть PolicyData's

- (instancetype) initWithDictionary:(NSDictionary *)responseObject error:(NSError *)err;

объявление волшебным образом становится

func initWithDictionary(responseObject : NSDictionary) throws

как описано в разделе "Обработка ошибок" этого документа о совместимости Apple Objective-C/Swift.

Вы можете добавить

convenience init?(dictionary: NSDictionary)

для любого объекта, который вы хотите инициализировать из словаря и инициализировать его свойства там.

Тем не менее, поскольку swift не выполняет динамическую диспетчеризацию (рано или поздно), вы не можете обобщать это, ожидая, что имена свойств будут ключами в словаре для любого объекта.

Другие вопросы по тегам