Swift 5.2 新特性

Swfit4.0 学习 2019-04-22 已阅 6251 次

  • 优雅处理转义字符
let param = #"somestring"# // somestring中转义字符不转义,原样输出
print(param)
  • 允许在模块中定义和标准库中名称一样的类型

比如在MyModule模块中定义Result

public enum Result<T> {
    case value(T)
    case error(Error)
}

如果你在任何代码中引入了 MyModule,比如

import MyModule
func doSomething() -> Result<Int> {  }

这时如果你需要引用标准库中的Result类型,你需要这样做,否则Result将解析到MyModule中的Result

func useStandardLibraryResult() -> Swift.Result<Int, Error> {  /* */  }
  • @dynamiccalable属性

使用@dynamiccalable属性后,调用函数就像使用简单语句一样。

@dynamicCallable struct ToyCallable {
    func dynamicallyCall(withArguments: [Int]) {}
    func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {  }
}

var x = ToyCallable()
x(1, 2, 3)
 // Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])`
        
x(label: 1, 2)
// Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2])`
  • 在枚举中不支持可变参数

例如:

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

在Swift5.2 中可变参数应该使用数组来代替

enum X {
    case foo(bar: [Int]) 
} 
func baz() -> X {
    return .foo(bar: [0, 1, 2, 3]) 
} 
  • Key paths支持ID密钥路径(\.self),一个可写入的密钥路径,可以引用其整个输入值
let id = \Int.self
var x = 2
print(x[keyPath: id]) // Prints "2"
x[keyPath: id] = 3
print(x[keyPath: id]) // Prints "3"
  • 条件编译,兼容Swift 5之前的代码
#if compiler(<5)
extension MyType: _ExpressibleByStringInterpolation { /*...*/ }
#else
extension MyType: ExpressibleByStringInterpolation { /*...*/ }
#endif 
未完待续

本文由 Harvey 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论