如何在 Swift 4 中编写 GCD asyncAfter?

How do I write GCD asyncAfter in Swift 4?

在 Swift 的早期版本中,此代码可以完美运行。

DispatchQueue.main.asyncAfter(deadline: .now() + delay) { timer in
    self.setOriginalState()
    self.shakeAnimation()
}

但是在Swift4中出现如下错误:

Ambiguous reference to member 'asyncAfter(deadline:qos:flags:execute:)'

如何在 Swift 4 中的 运行 代码序列之前创建延迟?

在 playground 中尝试没有任何问题,只是 "missing" 是 "timer" 参考。

DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    print("Dispatching after")
}

DispatchQueue.main.asyncAfter(deadline: .now() + 3, qos: .userInteractive, flags: []) {
    print("Dispatching after")
}

它们似乎都有效,您确定问题不在其他地方吗?

编译器似乎无法推断出 asyncAfter 调用中的参数类型。所以你可能想像这样指定类型:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay)

如果您仍然遇到相同的错误,请确保 delay 的类型为 DispatchTimeInterval。这是另一个例子:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.milliseconds(300)

这最终应该使编译器静音。