2017-01-06 4 views
0

Если мы хотим переопределить [dictionary objectForKey:@"key"], это может быть сделано путем подкласса класса NSDictionary. Как овервердить dictionary[@"key"]? В этом контексте я хочу знать, как реализовано dictionary[@"key"].Как используется словарь [@ "key"] в объективе c?

Спасибо!

Edit: Я хотел найти масштабируемое средство для синтаксического анализа ответа API, предотвращая [NSNull null] сбой моего приложения. Для этого я написал категорию для NSDictionary, но мне нужен способ разобрать в этом синтаксисе: data[@"key"] Итак, я оценивал возможность подкласса NSDictionary.

+0

Почему отрицательный голос? – crypt

ответ

2

При использовании dictionary[@"key"] это преобразуется в звонок по номеру [dictionary objectForKeyedSubscript:@"key"]. objectForKeyedSubscript: имеет то же поведение, что и objectForKey:.

Если вы хотите изменить поведение dictionary[@"key"], тогда вам необходимо переопределить objectForKeyedSubscript:.

У Apple NSDictionary API Reference есть дополнительная информация.

0

dictionary[@key] - короткая рука для звонка [dictionary objectForKeyedSubscript:@"key"]. Поэтому для переопределения функциональности dictionary[@"key"] вы можете подкласса NSDictionary.

@interface MyDictionary : NSDictionary 
    - (id) objectForKeyedSubscript:(id)key; 
@end 
@implementation MyDictionary 
    - (id) objectForKeyedSubscript:(id)key 
    { 
    /* 
     ... 
    */ 
    } 
@end 

Оригинальные категории ответов, используя, однако этот подход не рекомендуется, поскольку она будет переопределять оригинальный метод удаления доступа к super и потенциал столкновений должны несколько категорий грузиться перекрывая один и тот же метод. Последняя загружаемая категория будет использоваться во время выполнения, поэтому вы не можете гарантировать, что это будет.

dictionary[@key] - короткая рука для звонка [dictionary objectForKeyedSubscript:@"key"]. Поэтому, чтобы переопределить функциональность dictionary[@"key"], вы создадите новую категорию для NSDictionary.

//Category in NSDictionary+CustomKeyedSubscript.h and NSDictionary+CustomKeyedSubscript.m 
@interface NSDictionary (CustomKeyedSubscript) 
    - (id) objectForKeyedSubscript:(id)key; 
@end 
@implementation NSDictionary (CustomKeyedSubscript) 
    - (id) objectForKeyedSubscript:(id)key 
    { 
    /* 
     ... 
    */ 
    } 
@end 
+2

Но полезно ли переопределять методы в категории? Категории AFAIK должны использоваться только для добавления новых методов, а не для переопределения. Apple говорит: «Если имя метода, объявленного в категории, совпадает с методом в исходном классе или методом в другой категории в одном классе (или даже надклассе), поведение не определено в отношении реализация метода используется во время выполнения. Это менее вероятно, будет проблемой, если вы используете категории с вашими собственными классами, но могут создавать проблемы при использовании категорий для добавления методов в стандартные классы Cocoa или Cocoa Touch ». – crypt

+0

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

0

CAVEAT: Вы не объясните, что здесь проблема, которую вы пытаетесь решить, но для тех, кто приходит через этот вопрос в будущем, подклассов NSDictionary почти наверняка никогда что вы хотеть.

NSDictionary - кластер классов. Кластеры классов сложны для подкласса правильно с инструкциями, а в документации Apple явно указано не для подкласса, поэтому нет рекомендаций относительно того, как это сделать правильно.

Даже если вы можете использовать свой подкласс и «правильно работать» для своих целей, все остальные части кода в системе по-прежнему будут возвращать исходный класс NSDictionary, а не ваш подкласс, т вам.

Если вы чертовски настроены на то, как работает NSDictionary, создайте свой собственный класс-оболочку, в котором есть NSDictionary и создайте свою собственную реализацию objectForKeyedSubscript:.

Да, вы можете добавить индексирование индекса в свой собственный класс, как NSDictionary!

+0

@crypt: Я думаю, что этот вопрос составляет около месяца, но если вы хотите найти лучший способ решить вашу проблему, отправьте дополнительную информацию. –

+0

Я хочу проанализировать ответ API сервера, который может иметь нулевые значения для случайных параметров. Я хочу сделать приложение аварийным сбой при всех таких условиях. Для этого я написал категорию для NSNull, которая возвращает значения по умолчанию для общих методов NSString и NSNumber. Также, написанные категории для NSArray и NSDictionary, возвращающие нуль для null. – crypt

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