static NSDictionary* const letterValues = @{ ..... } in a method does not compile static NSDictionary* const letterValues = @{ ..... } in a method does not compile ios ios

static NSDictionary* const letterValues = @{ ..... } in a method does not compile


You can only set a static variable during initialization with a constant. @{} creates an object, thus not a constant.

Do this instead:

- (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,          };    });    ...}

Some other answers here suggest a check for nil instead of dispatch once, but that can cause issues when creating multiple tiles at the same time (via threads). dispatch_once implements the required locking.


You can use static, but the assignment can't be made on the same line. Try this:

- (void)awakeFromNib {    [super awakeFromNib];    static NSDictionary* letterValues = nil;    if (!letterValues) {        letterValues = @{@"A": @1,                         @"B": @4,                         @"C": @4,                         // ...                         @"X": @8,                         @"Y": @3,                         @"Z": @10};    }    ...}

The reason is that the @{<key> : <value>} syntax is translated by the compiler into an Objective-C method ([[NSPlaceholderDictionary alloc] initWithObjects:forKeys:count:]), which cannot be resolved at compile-time.


Another alternative is using the Macro Approach:

Macro (The Easiest) Approach (2021)

#define kScreenNames @{ \        @"HOME":                     @"Home Page", \        @"SEARCH":                   @"Search Page", \        @"MYLISTS":                  @"My List", \        @"MYACCOUNT":                @"My Aaccount" \}

it's short and elegant.

Then, you can use it like any other NSDictionary.

I hope this will help someone on the planet.

Best