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即可.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容