Могу ли я получить доступ к константе ObjC по имени строки во время выполнения?

Я знаю, что Objective-C позволяет мне обращаться к селекторам по имени, используя @selector(@"name") Как я могу получить доступ к следующей константе по имени во время выполнения? Другими словами, я бы прошел @"CONST_KEY" где-то и получить @"key" назад.

const NSString* CONST_KEY = @"key";

Я думаю, что могу сделать это, сначала создав словарь значений ключей, а затем запросив его во время выполнения, но я не уверен, что есть лучшая реализация.

Чтобы уточнить с конкретным вариантом использования:
Я хочу использовать идентификатор повторного использования ячеек представления коллекции @"CONST_KEY", объявленный в моей раскадровке, и чтобы иметь возможность использовать этот идентификатор для поиска значения CONST_KEY во время выполнения.

Таким образом, я надеюсь, что в моем коде будет единственное место для изменения констант, вместо того, чтобы переназначать значения в нескольких классах. Связывание двух значений позволит мне выполнить одно действие для всех этих ячеек, используя CONST_KEY определить действие, которое они собираются сделать.

2 ответа

Цель C - это просто C с добавленной функциональностью объекта. Таким образом, имя константы "CONST_KEY" отбрасывается во время компиляции. Таким образом, вы должны создать свой собственный класс или использовать NSDictionary для обеспечения функции "constant_name"->"constant_value".

Вам не нужно вызывать селектор, чтобы получить константу, вам просто нужно предоставить ее другим классам. Также константа должна жить внутри своего соответствующего класса. Метод, который я использую, заключается в следующем.

в заголовочном файле прямо под вашими инструкциями импорта (перед @interface) объявите это:

extern NSString *const CONST_KEY;

В том же месте файла реализации (над @interface и @implementation) объявите это:

NSString *const CONST_KEY = @"key";

После того, как вы это сделаете, в любом классе, который импортирует класс, в котором вы объявили свою константу, вы сможете ссылаться на него просто с помощью CONST_KEY

НАПРИМЕР

[someDictionary objectForKey: CONST_KEY];

или же

NSLog(@"%@", CONST_KEY); 

и т. д. - использование этого соглашения отлично подходит для безопасности типов. Я пользуюсь этим все время.

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