Могу ли я получить доступ к константе 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);
и т. д. - использование этого соглашения отлично подходит для безопасности типов. Я пользуюсь этим все время.