работает только если я использую промежуточную переменную - PullRequest
1 голос
/ 16 сентября 2010

Я пытаюсь установить текст UILabel равным названию дня недели, представленного в NSDateComponents. Я использую следующий код:

NSDateComponents *dateComponents = [[[NSDateComponents alloc] init] autorelease];
dateComponents.weekday = 1; //Sunday
NSString * const weekdayNames[8] = {@"Array starts at 1", @"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday"};

UILabel *myLabel = [[[UILabel alloc] init] autorelease];
myLabel.text = weekdayNames[dateComponents.weekday]; //compiler error: Assignment of read-only variable 'prop.49'

Я могу заставить код работать любым из трех способов:

  1. Сделать так, чтобы weekdayNames не было постоянным
  2. Присвойте dateComponents.weekday промежуточной переменной int, прежде чем использовать ее в качестве индекса массива
  3. Назначение дня недели [dateComponents.weekday] промежуточной переменной NSString * перед вызовом setText:

Но я хочу знать, почему мой код, как написано изначально, не работает.

1 Ответ

0 голосов
/ 16 сентября 2010

Вы не инициализируете NSDateComponents должным образом, поэтому день недели не возвращает ожидаемое вами значение.См. документацию .

. Теперь вы можете инициализировать ее, используя текущую дату:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
int weekday = [weekdayComponents weekday];

Позднее редактирование: Инициализация является частьюпроблема, чтобы исправить ошибку компилятора:

NSString * const weekdayNames[8] =

на

NSString const * weekdayNames[8] =

(указатель на постоянную строку NSString).

Однако, когда вы это делаете, выбудет выдано предупреждение "передача аргумента 1 из 'setText:' удаляет квалификаторы из целевого типа указателя" , потому что вы передаете постоянный указатель на функцию, которая ожидает указатель.Чтобы исправить предупреждение, вы можете привести аргумент setText к (NSString *).

Возможно, имеет смысл вообще удалить квалификатор const.Строки NSS уже неизменны в Objective-C, поэтому они уже являются константами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...