Ios 方法中的静态NSDictionary*const lettValues=@{….}未编译
在: 我试图在自定义视图中使用以下代码: 不幸的是,这给了我编译错误初始值设定项元素不是编译时常量,我必须删除Ios 方法中的静态NSDictionary*const lettValues=@{….}未编译,ios,objective-c,static,nsdictionary,constants,Ios,Objective C,Static,Nsdictionary,Constants,在: 我试图在自定义视图中使用以下代码: 不幸的是,这给了我编译错误初始值设定项元素不是编译时常量,我必须删除static关键字才能在Xcode中编译我的应用程序(此处): 我想我使用新语法正确初始化了NSDictionary 但是为什么我不能在这里使用static 我认为在这里应该确保我的letterValues常量只设置一次?您可以使用static,但不能在同一行上进行赋值。试试这个: - (void)awakeFromNib { [super awakeFromNib];
static
关键字才能在Xcode中编译我的应用程序(此处):
我想我使用新语法正确初始化了NSDictionary
但是为什么我不能在这里使用static
我认为在这里应该确保我的
letterValues
常量只设置一次?您可以使用static,但不能在同一行上进行赋值。试试这个:
- (void)awakeFromNib {
[super awakeFromNib];
static NSDictionary* letterValues = nil;
if (!letterValues) {
letterValues = @{@"A": @1,
@"B": @4,
@"C": @4,
// ...
@"X": @8,
@"Y": @3,
@"Z": @10};
}
...
}
原因是编译器将
@{:}
语法转换为Objective-C方法([[NSPlaceholderDictionary alloc]initWithObjects:forKeys:count:///code>),该方法在编译时无法解析。NSDictionary
对象无法在编译时创建。但是,如果需要静态对象,可以创建一个。例如,您可以使用初始化方法,如下所示:
static NSDictionary* letterValues;
+ (void)initialize
{
if (self == [MyClass class]) {
letterValues = @{
@"A": @1,
@"B": @4,
@"C": @4,
@"X": @8,
@"Y": @3,
@"Z": @10,
};
}
}
if语句用于防止在MyClass
子类中多次调用代码。您只能在初始化期间使用常量设置静态变量@{}创建一个对象,因此不是常量
改为这样做:
- (void)awakeFromNib
{
[super awakeFromNib];
static NSDictionary* letterValues = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
letterValues = @{
@"A": @1,
@"B": @4,
@"C": @4,
// ...
@"X": @8,
@"Y": @3,
@"Z": @10,
};
});
...
}
这里的一些其他答案建议检查nil而不是一次分派,但这可能会在同时创建多个tile(通过线程)时引起问题。dispatch\u一旦执行了所需的锁定。另一种选择是使用宏方法:
宏观(最简单)方法(2021年)
它又短又优雅
然后,你就可以像其他字典一样使用它了
我希望这能帮助这个星球上的人
最好的将其从类中移出将其从类中移出会在相同的编译时间内产生结果error@Btw.代码是有效的,在ObjuleC++中工作- -代码是有效的(我的问题代码不在XCODE 5.1中编译),ObjaveC++ +什么意思?(而且文档很差)。Objective-C++文件的扩展名为.mm。如果将文件重命名为“Tile.mm”,则应编译代码,因为C++对静态初始化器有不同的规则。-但这只是一个注释,而不是解决方案。-你也可以看看,这是一个不同的问题,类似的答案。使用<代码> DeXCHYSUng/<代码>是初始化这种数据对象的最好和最安全的方法。这是这里最正确的答案。+(void)load
是否更合适?@d这确实取决于您的用例。请参阅以了解有关加载
和初始化
之间差异的更多信息。
- (void)awakeFromNib
{
[super awakeFromNib];
static NSDictionary* letterValues = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
letterValues = @{
@"A": @1,
@"B": @4,
@"C": @4,
// ...
@"X": @8,
@"Y": @3,
@"Z": @10,
};
});
...
}
#define kScreenNames @{ \
@"HOME": @"Home Page", \
@"SEARCH": @"Search Page", \
@"MYLISTS": @"My List", \
@"MYACCOUNT": @"My Aaccount" \
}