Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 方法中的静态NSDictionary*const lettValues=@{….}未编译_Ios_Objective C_Static_Nsdictionary_Constants - Fatal编程技术网

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" \
}