近日,苹果开发者博客更新了一篇关于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