2016-10-07 2 views
1

У меня есть следующие строки:Разницы между доступом к данным с помощью индексации и используя только valueForKey в NSDictionary

_driverName.text = [[[responseDictionary valueForKey:@"response" ] valueForKey:@"driverinfo"]valueForKey:@"name"]; 

Но я думаю, что я могу сжать эту линию, используя подписку таким образом:

_driverName.text = responseDictionary[@"response" ][@"driverinfo"][@"name"]; 

это кажется более чистым и читаемым. Можно ли применить этот синтаксис без побочных последствий? заблаговременно

+1

Не используйте 'valueForKey:', если вы специально не используете кодирование с ключом. Всегда используйте 'objectForKey:', чтобы получить нормальное значение из словаря. – rmaddy

+1

Теоретически, если responseDictionary [@ "response"] не является словарем, вторая строка будет разбиваться, а первая будет возвращать нуль или даже некоторое значение, если есть экземпляр подкласса NSObject с указанными свойствами – alexburtnik

ответ

2

Игнорирование неправильного использования valueForKey: (используйте objectForKey:), вы не должны использовать какой-либо пример в своем вопросе. Оба страдают от невозможности отладки, когда вы сталкиваетесь с проблемами, потому что структура данных - это не то, что вы считали.

Хотя это занимает больше времени, он стоит в конце концов, чтобы разделить каждый доступ в отдельную строку:

NSDictionary *response = responseDictionary[@"response"]; 
NSDictionary *driverInfo = response[@"driverInfo"]; 
_driverName.text = driverInfo[@"name"]; 

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

+0

спасибо за объяснение! очень ясно –