Макрос раскрывает параметры как строки

Я хочу упростить написание «клеевого» кода в своем приложении.

Моя цель имеет что-то вроде:

MAKE_KEY(keyname)

расширяться как

#define keyname @"keyname"

К сожалению, я почти уверен, что не могу использовать #define в #define.

Итак, я планирую расширить:

MAKE_KEY(keyname)

as

keyname @"keyname"

чтобы я мог написать:

#define MAKE_KEY(USER_ID)

и получить

#define USER_ID @"USER_ID"

Как мне это сделать?

Покажите, как вы хотите использовать расширенные значения для решения вашей проблемы

Я хотел бы сгенерировать #define MY_CONST @"MY_CONST", не набирая два раза слово MY_CONST (потому что мне нужно обработать их так много…). Затем я буду использовать MY_CONST везде, где мне это нужно в коде.

Я делаю это, потому что у меня будут такие объекты, как people, или cities, или plants, или animals и т. д., у которых не будет много методов, а будет много переменных. Эти объекты должны быть сериализуемыми.

Есть два способа сделать это:

  1. Имейте свойство для каждой переменной и напишите соответствующее кодирование с помощью метода кодера (настоящая боль)

  2. Введите все данные в словарь, а затем сериализуйте словарь в encodewithcoder.

Я выбрал решение №2. Но я все еще хотел бы иметь аксессуары. Итак, я мог бы разработать макрос, который бы писал для меня методы доступа, выбирая правильное значение из словаря.

Общим для всех является то, что метод доступа и ключ словаря имеют одно и то же имя.


person Community    schedule 19.08.2014    source источник
comment
Вы все еще создаете #define из #define. Покажите, как вы хотите использовать расширенные значения, чтобы решить вашу проблему.   -  person trojanfoe    schedule 19.08.2014
comment
@trojanfoe Спасибо за ваш ответ. Я обновил свой вопрос соответственно.   -  person    schedule 19.08.2014


Ответы (1)


Для констант, используемых во всем приложении, обычно считается лучшим иметь все определения строк (или других объектов) в одном файле реализации (например, Constants.m) и иметь файл заголовка declaring< /em> эти экземпляры как extern (например, в Constants.h):

Константы.ч:

extern NSString * const CONST_STRING_1;
extern NSString * const CONST_STRING_2;
extern NSString * const CONST_STRING_N;

Константы.м:

#import "Constants.h"

NSString * const CONST_STRING_1 = @"CONST_STRING_1";
NSString * const CONST_STRING_2 = @"CONST_STRING_2";
NSString * const CONST_STRING_N = @"CONST_STRING_N";

Один из способов сократить набор текста:

Константы.ч:

#define EXCONST(name) extern NSString * const name
#define CONST(name) NSString * const name = @#name

EXCONST(CONST_STRING_1);
EXCONST(CONST_STRING_2);
EXCONST(CONST_STRING_N);

Константы.м:

#import "Constants.h"

CONST(CONST_STRING_1);
CONST(CONST_STRING_2);
CONST(CONST_STRING_N);

Затем вы сможете ссылаться на эти постоянные строки, используя только имя:

dict[CONST_STRING_1] = @"Hello";

Примечание. Это не проверено, поэтому возможны ошибки.

person trojanfoe    schedule 19.08.2014