2015-12-08 4 views
0

У меня есть пользовательский объект, который содержит json. Если я его распечатаю, это выглядит какSwift - извлечение данных из словаря

{ 
    "first_name" = Name; 
    id = 111111; 
    "last_name" = LastName; 
    "photo_100" = "https://url.jpg"; 
} 

Этот объект является объектом недвижимости .json. Для того, чтобы извлечь из него данные в Objective-C Я использую

NSLog(@"id%@", [[response.json firstObject] objectForKey:@"id"]); 

Но в Swift, если я пытаюсь

var dict = response.json 

self.name = dict.firstObject.objectForKey("first_name") 
self.lastName = dict.firstObject.objectForKey("last_name") 
self.photoUrl = dict.firstObject.objectForKey("photo_100") 

я получаю компиляции или ошибки во время выполнения. Я попытался вызвать firstObject в декларации dict и попытался подавить строку - все приводит к ошибкам.

Как правильно извлечь данные?

UPD: определение объекта

@interface VKResponse : VKObject 

/// Request which caused response 
@property(nonatomic, weak) VKRequest *request; 
/// Json content of response. Can be array or object. 
@property(nonatomic, strong) id json; 
/// Model parsed from response 
@property(nonatomic, strong) id parsedModel; 
/// Original response string from server 
@property(nonatomic, copy) NSString *responseString; 

@end 
+0

Какая ошибка вы получаете? Какой тип это переменная 'json'? – Losiowaty

ответ

1

Если вы можете написать [response.json firstObject] в Objective C, то response.json не словарь, но массив.

В коде Swift вы добавили его в словарь, который явно не сработает.

1

На основании кода, который вы отправили, пользовательский объект не содержит JSON, он содержит объекты, которые были созданы от JSON. Как отметил @TheEye в своем ответе, ваш объективный код C предполагает, что у вас есть массив словарей.

Swift более строго типизирован, чем Objective-C. По умолчанию словари и массивы являются однородными: словари могут содержать только пары ключ/значение, где тип ключа всегда один и тот же тип значения всегда один и тот же.

Аналогично, Swift Массивы обычно печатаются так, что они должны содержать все те же типы объектов.

Вы можете создать Swift Словари или Массивы, содержащие общие объекты ([AnyObject: AnyObject] для словаря или [Anyobject] для массива).

Опубликовать определение своего пользовательского объекта и его свойство json. Нам нужно знать, как это объявлено, чтобы точно определить, что вам нужно сделать, чтобы исправить вашу проблему.

+0

обновленное сообщение с объектом –

+0

Видя, что тип 'id' для свойства json на самом деле не помогает ... – TheEye

+0

Это код Objective-C, и, как указывает TheEye, он определяется с помощью идентификатора типа, который эквивалентен типу AnyObject Swift, что не полезно. –

0

Сначала убедитесь, что у вас есть объект.

if let jsonDict = json as? [String:AnyObject] { 

} 
if let jsonArray = json as? [AnyObject]{ 

}