DispatchTime
的参数是时间,单位既不是秒也不是毫秒,而是纳秒。
使用的方法如下:
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(5)) {
// Do your work here
}
延迟 5 秒执行,就要写为:DispatchTime.now() + .seconds(5)
,很长而且没有必要。
如果可以像 sleep
一样直接传入一个数字就好了。
Swift 为这个场景很贴心的提供了一个专门的特性:字面量和字面量协议。
字面量啥意思呢,看下面的举例:
let a = 123
let b = 12.3
let c = "123"
123
,12.3
和 "123"
就是字面量,即通过字面来表达的类型,分别是 Int
,Double
和 String
。
如果你的自定义类遵守了字面量协议,那么就可以通过以上写法来初始化。
是不是很方便?
下面就来扩展 DispatchTime
,让它可以通过 Int
和 Double
来直接初始化,而且约定字面量的单位是秒:
extension DispatchTime : ExpressibleByIntegerLiteral,
ExpressibleByFloatLiteral {
public init(integerLiteral val: Int) {
self = .now() + .seconds(val)
}
public init(floatLiteral val: Double) {
self = .now() + .milliseconds(Int(val * 1000))
}
}
扩展以后,使用就很简单了:
DispatchQueue.main.asyncAfter(deadline: 5) {
// Do your work here
}
字面量协议对于简化代码很有帮助,但需要注意使用场景,避免阅读代码的时候模糊了语义造成理解困难。