Подтвердить что ты не робот

Как создать постоянную NSString путем конкатенации строк в Obj-C?

Я пытаюсь создать постоянную NSString, объединяя другие экземпляры NSString.

Вот что я делаю в моем файле реализации:

static NSString *const MY_CONST = @"TEST";
static NSString *const MY_CONCATENATE_CONST = [NSString stringWithFormat:@"STRING %@", MY_CONST];

Это приводит к следующей ошибке компиляции: элемент Initializer не является константой

Я предполагаю, что это потому, что stringWithFormat не возвращает константу NSString, но поскольку нет другого способа конкатенации строк в Obj-C, что я должен делать?

Спасибо за вашу помощь,

Эрик.

4b9b3361

Ответ 1

Думаю, вам нужно отступить и подумать о том, должна ли строка быть определена как const.

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

Если строка сохраняется как свойство в классе, вы можете сделать это свойство только для чтения, то есть метод доступа, но не метод setter. Затем вы сможете построить свою строку, как хотите, внутри класса, не позволяя вызывающим абонентам изменять значение.

Ответ 2

Я думал, что должен быть способ сделать это, но лучшее, что я мог сделать, это использовать директиву #define. Например,

// Define the base url as an NSString
#define BASE_URL @"http://www.milhouse.co.uk/"

// Now the derived strings glued by magic
NSString *const kBaseURL    = BASE_URL;
NSString *const kStatusURL  = BASE_URL @"status.html";
NSString *const kBalanceURL = BASE_URL @"balance.html";

Ответ 3

static const objects value определяется во время компиляции, поэтому вы действительно не можете добавлять вызовы методов к их инициализации. В качестве альтернативы вы можете сделать следующее:

static NSString *const MY_CONST = @"TEST";
static NSString *MY_CONCATENATE_CONST = nil;

if (nil == MY_CONCATENATE_CONST)
   MY_CONCATENATE_CONST = [NSString stringWithFormat:@"STRING %@", MY_CONST];