Swift:你一定不知道的枚举

升级xCode10,项目中发现了一些crash.挺有意思,记录一下.项目为OC和Swift混编.

案例

swift:

enum SwiftEnum: Int {
   case a = 0
   case b
}
let enum1 = SwiftEnum.init(rawValue: 3)

enum1是什么?

oc:

typedef NS_ENUM(NSInteger, OCEnum) {  
    OCEnum1 = 0,
    OCEnum2
};
OCEnum enum2 = (OCEnum)3

- (OCEnum)test {
    return (OCEnum)5
}

enum2是什么

swift调用oc方法:

let enum3 = OCEnum(rawValue: 3)
let enum4 = oc.test()

enum3,enum4是什么?

答案:
enum1 = nil
enum2 = 3
enum3 = OCEnum类型的枚举,raw value为3,但被标记为invalid的不知道什么东西的内存数据
enum4同上

在xcode9中
使用在oc中使用enum2,enum3,enum4没有问题,被当做int使用即可.在swift中,因为swift语言级bug.
默认进入第一个case,有default也不会进入.修正该问题有一个trick.当enum有n个case,switch中只写了
n-2个case,则会进入default.

在xcode10中
该bug疑似被修复.该enum不会命中任何case,如果没有default,则crash.使用defalut即可.

你可能感兴趣的:(Swift:你一定不知道的枚举)