Swift 5.0 值得关注的特性:Handle unknown values using “@unknown defa

Swift 5.0 引入了@unknown default,解决枚举未来添加新case时的兼容性问题,提供编译器警告,并确保对系统库枚举扩展的兼容。此外,介绍了frozen enum的概念,C风格和Foundation枚举受此影响,而Swift自定义枚举默认被视为frozen。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把 swift 升级到 5.0 的时候相信大家一定会遇到建议添加 @unknown default 的警告:image.png

@unknown default 解决的两个问题

未来增加新的 case 后不会影响原有代码的编译

如果 switch 语句中覆盖了枚举的每个 case,那么未来这个枚举如果增加了一个值,一定会对原来调用的代码造成 break change。如果是我们自己定义的枚举还好改,如果是系统级的库就会造成很大的影响。大概也是考虑到 swift 5.0 开始 ABI 稳定的承诺,引入 @unknown default 对未来枚举的扩展新值时保证兼容性提供了很好的支持。

在有新的枚举值时编译器可以提醒

如果在 switch 语句中使用了 default,如果未来新增了枚举值也不会破坏到调用代码的编译。但是用户会很难发现有新的枚举选项产生了。Apple 举了一个 UIKeyboardType 的例子,这已经是一个非常早期就存在的枚举,但是在 iOS 10 中还是新增了 asciiCapableNumberPad了这个选项。iOS 每个版本升级底层都会增加了一些功能,使用@unknown default 标记在 switch 语句中,如果有新的枚举值编译器就可以很好的提示用户有新的 case 需要处理。

Frozen enum

有些枚举未来可能会变动,有些在声明的时候就很确定不会改变。这种状态 apple 称之为 frozen。枚举有两种可能:frozen(不变的)和 non-frozen(值会变的)。原来 OC 中的所有枚举默认都认为是 non-frozen 的。

如果想要把枚举声明为  non-frozen,使用 NS_CLOSED_ENUM 声明:

typedef NS_CLOSED_ENUM(NSInteger, NSComparisonResult) {  NSOrderedAscending = -1L,  NSOrderedSame,  NSOrderedDescending};

影响范围

目前 @unknown default  只针对 C 风格的 enum 和 Foundation 中的枚举起作用,用户在 swift 自定义的枚举都认为是 frozen 的。

我也不是很理解为什么这个枚举的类型区分只支持 OC,swift 不支持。这个特性如果被社区接受的话,猜测 swift 在未来版本也会支持用户自定义的 swift 枚举也可以标记为 non-frozen。


  •  
     


  • 微博:@没故事的卓同学 交流群号: 869685378   寻ios马甲包技术大大,上架cp qp应用 Q 51259559 长期合作

  •  


作者:没故事的卓同学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值