只有在我使用中间变量时才有效

时间:2010-09-16 04:35:37

标签: iphone objective-c arrays uilabel

我正在尝试将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. 使工作日名称不是常量
  2. 将dateComponents.weekday分配给中间int变量,然后将其用作数组索引
  3. 在调用setText之前将工作日[dateComponents.weekday]分配给中间NSString *变量:
  4. 但我想知道为什么我的代码原本写的会失败。

1 个答案:

答案 0 :(得分:0)

您没有正确初始化NSDateComponents,因此工作日不会返回您期望的值。请参阅the documentation

现在您可以使用当前日期对其进行初始化:

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的指针)。

然而,当你这样做时,你会发出警告“传递'setText:'的参数1'从指针目标类型”中丢弃限定符,因为你传递了一个指向期望函数的常量指针一个指针。要修复警告,可以将参数转换为setText为(NSString *)。

完全删除const限定符可能是有意义的。 NSStrings在Objective-C中已经是不可变的,因此它们已经是常数。