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

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

把 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 长期合作

  •  


作者:没故事的卓同学

root@ER7206:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group defaul t qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master inf st ate UP group default qlen 1000 link/ether 9a:7b:ec:2b:0f:85 brd ff:ff:ff:ff:ff:ff inet6 fe80::987b:ecff:fe2b:f85/64 scope link valid_lft forever preferred_lft forever 3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether 9e:76:53:b0:be:0c brd ff:ff:ff:ff:ff:ff inet6 fe80::9c76:53ff:feb0:be0c/64 scope link valid_lft forever preferred_lft forever 4: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000 link/ipip 0.0.0.0 brd 0.0.0.0 5: ip6_vti0@NONE: <NOARP> mtu 1332 qdisc noop state DOWN group default qlen 1000 link/tunnel6 :: brd :: 6: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000 link/sit 0.0.0.0 brd 0.0.0.0 7: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000 link/tunnel6 :: brd :: 8: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default qlen 1000 link/gre 0.0.0.0 brd 0.0.0.0 9: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN group defa ult qlen 1000 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 10: erspan0@NONE: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN group def ault qlen 1000 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 11: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group def ault qlen 1000 link/ether 3a:5f:b6:ef:94:bf brd ff:ff:ff:ff:ff:ff 12: inf: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 9a:7b:ec:2b:0f:85 brd ff:ff:ff:ff:ff:ff inet6 fe80::987b:ecff:fe2b:f85/64 scope link valid_lft forever preferred_lft forever 13: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-lan state UP group default qlen 1000 link/ether be:e9:a1:e9:b4:bf brd ff:ff:ff:ff:ff:ff 14: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 8c:86:dd:33:21:89 brd ff:ff:ff:ff:ff:ff inet6 fe80::8e86:ddff:fe33:2189/64 scope link valid_lft forever preferred_lft forever 15: inf.4@inf: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 8c:86:dd:33:21:88 brd ff:ff:ff:ff:ff:ff inet 192.168.2.1/24 scope global inf.4 valid_lft forever preferred_lft forever inet6 fe80::8e86:ddff:fe33:2188/64 scope link valid_lft forever preferred_lft forever 16: inf.1@inf: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 8c:86:dd:33:21:88 brd ff:ff:ff:ff:ff:ff inet 192.168.0.1/24 scope global inf.1 valid_lft forever preferred_lft forever inet6 fe80::8e86:ddff:fe33:2188/64 scope link valid_lft forever preferred_lft forever 17: inf.3@inf: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 8c:86:dd:33:21:88 brd ff:ff:ff:ff:ff:ff inet 192.168.1.1/24 scope global inf.3 valid_lft forever preferred_lft forever inet6 fe80::8e86:ddff:fe33:2188/64 scope link valid_lft forever preferred_lft forever 18: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP gr oup default qlen 1000 link/ether 8c:86:dd:33:21:88 brd ff:ff:ff:ff:ff:ff inet 169.254.11.21/30 brd 169.254.11.23 scope global br-lan valid_lft forever preferred_lft forever inet6 fe80::8e86:ddff:fe33:2188/64 scope link valid_lft forever preferred_lft forever 19: inf.0@inf: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:14:78:00:00:00 brd ff:ff:ff:ff:ff:ff inet6 fe80::214:78ff:fe00:0/64 scope link valid_lft forever preferred_lft forever 20: inf.4094@inf: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue sta te LOWERLAYERDOWN group default qlen 1000 link/ether 8c:86:dd:33:21:89 brd ff:ff:ff:ff:ff:ff 25: eth1.4093@eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue s tate LOWERLAYERDOWN group default qlen 1000 link/ether 8c:86:dd:33:21:8a brd ff:ff:ff:ff:ff:ff inet6 fe80::8e86:ddff:fe33:218a/64 scope link valid_lft forever preferred_lft forever
最新发布
08-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值