Swift 5新特性详解:ABI 稳定终于来了!

近日,苹果开发者博客更新了一篇关于Swift 5的文章,带来了Swift 5新特性的消息,其中最受开发期待的莫过于iOS 12.2将带来ABI 稳定性,这意味着基础库将植入系统中,不再包含在App中,应用程序的体积会更小,更多新功能请看下文。

App瘦身

新功能

Swift应用程序不再包含用于Swift标准库和Swift SDK(运行iOS 12.2、watchOS 5.2和tvOS 12.2的设备的构建变体)的动态链接库。因此,在使用TestFlight进行测试时,或者为本地开减小应用程序体积时,Swift应用程序可以变得更小。

要查看iOS 12.2和iOS 12.1(或更早版本)应用程序之间的文件大小差异,请将应用程序的部署目标设置为iOS 12.1或更早版本,将scheme设置为Generic iOS Device,然后创建应用程序压缩包。

在构建好压缩包之后,从压缩包管理器中选择Distribution App,然后选择Development Distribution。确保在App Thinning下拉菜单中选择特定的设备,比如iPhone XS。这个过程完成后,在新创建的文件夹中打开App Thinning Size Report。iOS 12.2的体积会比iOS 12.1或更早版本的体积小。具体的大小差异取决于应用程序使用的框架的数量。

Swift

@dynamicCallable属性允许你调用命名的类型,就像使用简单的语法糖调用函数一样。主要的应用场景是动态语言互操作性。

例如:

@dynamicCallable struct ToyCallable {    func dynamicallyCall(withArguments: [Int]) {}    func dynamicallyCall(withKeywordArguments: KeyValuePairs\u0026lt;String, Int\u0026gt;) {}}let x = ToyCallable()x(1, 2, 3)// Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])`x(label: 1, 2)// Desugars to `x.dynamicallyCall(withKeywordArguments: [\u0026quot;label\u0026quot;: 1, \u0026quot;\u0026quot;: 2])`

现在支持标识KeyPath(.self),一个引用其整个输入值的WritableKeyPath

let id = \\Int.selfvar x = 2print(x[keyPath: id]) // Prints \u0026quot;2\u0026quot;x[keyPath: id] = 3print(x[keyPath: id]) // Prints \u0026quot;3\u0026quot;

在Swift 5之前,你可以编写一个带有可变参数的枚举:

enum X {    case foo(bar: Int...) }func baz() -\u0026gt; X {    return .foo(bar: 0, 1, 2, 3) } 

现在如果这么做会出错。相反,现在参数改成了一个数组,并且需要显式传入数组:

enum X {    case foo(bar: [Int]) } func baz() -\u0026gt; X {    return .foo(bar: [0, 1, 2, 3]) } 

在Swift 5模式下,可以用?和Optional类型表达式来扁平化生成的Optional,而不是返回嵌套的Optional

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值