- Print 函数传参新格式
let param = "参数"
print(#"这是一个\#(param) xxxxx"#)
- 允许在模块中定义和标准库中名称一样的类型
比如在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
未完待续 |
---|