Swift 使用字面量协议扩展 DispatchTime

Dec 30, 2019 • 预计阅读时间 1 分钟

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"

12312.3"123" 就是字面量,即通过字面来表达的类型,分别是 IntDoubleString

如果你的自定义类遵守了字面量协议,那么就可以通过以上写法来初始化。

是不是很方便?

下面就来扩展 DispatchTime,让它可以通过 IntDouble 来直接初始化,而且约定字面量的单位是

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
}

字面量协议对于简化代码很有帮助,但需要注意使用场景,避免阅读代码的时候模糊了语义造成理解困难。

Swift

CSS flex wrap 布局中设置元素间距

checkra1n 越狱后连接 SSH

comments powered by Disqus