在Swift中,
在Objective-C中没有这种安全性,通过将非成员"rawValue"强制转换为枚举类型可能会创建无效的枚举成员。
init(rawValue:)
系统确保将Int
转换为枚举类型时,结果要么是有效的枚举case,要么是nil
。在Objective-C中没有这种安全性,通过将非成员"rawValue"强制转换为枚举类型可能会创建无效的枚举成员。
typedef NS_ENUM(NSInteger, ExampleEnum) {
first = 0,
second,
third,
};
+ (NSString *)stringForCase:(ExampleEnum)enumCase {
switch (enumCase) {
case first: return @"first";
case second: return @"second";
case third: return @"third";
}
}
+ (void)testEnum {
ExampleEnum invalidCase = (ExampleEnum)3; // this "rawValue" is out of bounds
NSString *string = [self stringForCase:invalidCase]; // nil
}
当枚举类型被开启时,编译器会警告您未处理的枚举值:
在 switch 中未处理枚举值 'third'
但是一旦所有情况都已处理,就没有类似的警告表明仍然可能有一个无效的成员变量的“默认”情况。
在这种情况下会发生什么行为?NSString 方法似乎返回 nil
,并且没有观察到崩溃。但是该方法没有 return
。是否会自动生成 return nil
,在什么情况下会生成?
请注意,“穷尽”switch 后的代码语句不会导致通常会生成的警告:
代码将永远不会被执行