表达式的类型是模棱两可的,没有更多的上下文错误源于两个事实:
- Swift 不知道如何添加 a
DispatchTime和Int.
- 由于事实 1,Swift 不知道如何解释
.now().
Swift 不知道如何添加 aDispatchTime和 anInt
这可以通过以下方式证明:
let t = DispatchTime.now() + Int(5)
二元运算符“+”不能应用于“DispatchTime”和“Int”类型的操作数
但 Swift 确实知道如何添加 aDispatchTime和 a Double:
let t = DispatchTime.now() + Double(5)
这编译得很好,没有错误。
那么为什么DispatchQueue.main.asyncAfter(deadline: .now() + 5)有效呢?
在这种情况下,Swift 将整数文字解释5为Double. 类型Double符合ExpressibleByIntegerLiteral允许您执行的协议:
let d: Double = 5
所以在这种情况下,它可以工作,因为5它不是一个Int,而是一个Double。
由于事实 1,Swift 不知道如何解释.now()
当您尝试添加Intto 时.now():
DispatchQueue.main.asyncAfter(deadline: .now() + int)
Swift 类型推理系统很困惑。Swift 知道它想将 a 传递DispatchTime给asyncAfter(deadline:),但它不再能够弄清楚是什么.now(),因为无法添加 aDispatchTime和 anInt来获得 a DispatchTime,它决定那.now()不是 aDispatchTime而是其他一些未知类型。因此,模棱两可的错误消息来自 Swift 无法确定是什么.now()。
如果你通过说 来明确表示DispatchTime.now(),那么你会得到一个更明智的错误:
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + int)
二元运算符“+”不能应用于“DispatchTime”和“Int”类型的操作数
作为该理论的进一步证据,如果您为 Swift 提供一种添加 aDispatchTime和 an 的方法Int,Swift 会对您的原始代码感到满意:
func +(_ lhs: DispatchTime, _ rhs: Int) -> DispatchTime {
return lhs + .seconds(rhs)
}
那么这是什么.seconds()东西呢?它如何帮助解决错误?
有一个相关类型enum有DispatchTimeIntervalcase microseconds(Int)、milliseconds(Int)、nanoseconds(Int)和。Swift 知道如何添加 a和 a ,因此 Swift 能够解释为 a which 然后允许它解释为 a 。seconds(Int)neverDispatchTimeDispatchTimeInterval.seconds(int)DispatchTimeInterval.now()DispatchTime
为什么 Swift 设计者选择让你添加 aDouble到 aDispatchTime而不是 a Int?
你得问他们。我怀疑他们Double出于方便而选择了(允许使用诸如文字值之类的值2.5),并且因为它允许您指定小于一秒的时间间隔。Int不会为您提供任何额外的功能(当然除了消除这个非常令人困惑的错误消息)。
结论
错误来自您尝试将 Swift 添加Int到DispatchTime.
其他答案建议的修复:
使用Double.
或者
使用DispatchTimeInterval enum来明确注意您所Int代表的内容。在你的情况下.seconds(int)。