【问题标题】:Constants file with a static Enum and a Dictionary带有静态枚举和字典的常量文件
【发布时间】:2018-04-20 18:06:14
【问题描述】:

我是 Objective C 的新手(来自 Java 世界)。

我正在尝试创建一个常量头文件,它可以允许类使用静态常量、静态枚举和静态字典。

这是 Constants.h 的伪代码

extern NSString* const WelcomeMessage;

typedef enum {
RED,
GREEN,
ORANGE
} Color;

//Use the above Color Enum values as keys to map each color to a message String.

NSDictionary *colorMapper= [NSDictionary dictionaryWithObjectsAndKeys:
    RED, @"Excellent choice. Red is the color of love",
    GREEN, @"Can't go wrong with Green. Green is associated with Nature",
    ORANGE, @"The color is as sweet as a juicy Floridian Orange"
];

常量.m

...

- (void)printColor:(Color) color
{
  NSLog(@"%@", [colorMapper objectForKey:color]);

}

我正在尝试弄清楚如何正确声明静态常量、静态枚举和静态字典,其中键为颜色枚举,值类型为字符串。这是可行的(可以允许静态枚举和以枚举为键的字典)吗?如果没有,是否有任何替代方法来实现此行为?

【问题讨论】:

  • 除了只能在运行时分配的字典之外的所有东西都是可行的。一种替代方法是 RED_MESSAGE、GREEN_MESSAGE 等的另一个枚举,但我认为您正试图避免代码中出现大的 if-else 分支。获得所需内容的唯一方法是放松对数据是静态定义的约束。 (您可以创建一个使用静态标量值初始化的已分配对象)

标签: ios objective-c


【解决方案1】:

[所有代码直接输入到答案中,除非有错别字。]

(Objective-)C 对常量初始化中可以使用的表达式和类型有限制;这些包括原始类型(整数、字符等)、字符串(C 和NSString),但不包括NSDictionary 值。

但是,对于 Objective-C,有一个 +load 方法,当包含代码的二进制文件(应用程序或框架)被加载时会调用该方法。此方法在任何 +initialize 方法之前运行。使用它你可以实现你想要的,从你的Constants.h开始:

extern NSString * const WelcomeMessage;

typedef enum {
   RED,
   GREEN,
   ORANGE
} Color;

extern NSDictionary * colorMapper;

并在您的Constants.m 中定义一个类来包含+load 来初始化您的NSDictionary

#import "Constants.h"

NSString * const WelcomeMessage = @"...";

NSDictionary * colorMapper;

// pick a hard to type name...
@interface Private_Hidden_Class_To_Init_Dictionary_
@end

@class Private_Hidden_Class_To_Init_Dictionary_

+ (void) load // will execute automatically when this file is loaded
{
   colorMapper = 
      @{ @(RED) : @"Excellent choice. Red is the color of love",
         @(GREEN) : @"Can't go wrong with Green. Green is associated with Nature",
         @(ORANGE) : @"The color is as sweet as a juicy Floridian Orange"
      };
}

@end

此代码对字典使用 @{ ... } Objective-C 文字语法。还要注意使用 @(RED) 等作为键,这与您的代码不同。 NSDictionary 的键必须是对象,@(RED) 是一个 Objective-C 文字,它产生 NSNumber 类型的对象。

(注意:可能有一个属性可以附加到 C 函数以赋予它相同的加载时运行语义,但是我没有在 Clang 文档中找到一个列出的属性。使用 C 函数会删除对类的需要。)

HTH

【讨论】:

  • 精彩的回答!!太感谢了!!如何创建可以接受所选“颜色”并将其打印到控制台的附加方法? (我已经用包含此方法的 Constants.m 更新了原始问题) - (void)printColor:(Color) color { NSLog(@"%@", [colorMapper objectForKey:color]); }
  • 您需要使用[colorMapper objectForKey:@(color)],或者使用现代语法更好的colorMapper[@(color)],如定义字典时的答案所示 - 键必须是对象并且@(...)从数值生成 NSNumber 对象。另外,我希望您可能希望将此作为类方法 (+ printColor) 或只是像 NSLog 本身这样的函数 (void printColor(Color color) { ... })。
  • 谢谢!除了 ios 上的 Apple Developer 官方文档之外,您还有其他资源可以推荐用于 Objective C 的不错入门吗?
  • Apple 文档中的所有内容都在某处......是的,找到它可能是一个挑战!一个可能不太明显的地方是 Xcode 发行说明,因为它们在发布时记录了该语言的新功能。除此之外还有书籍/在线资源,但抱歉我没有具体的建议
猜你喜欢
  • 1970-01-01
  • 2011-07-30
  • 2011-01-14
  • 1970-01-01
  • 2017-04-19
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多