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