我如何修复此代码,使它不会给予错误:表达式类型在没有更多上下文的情况下不明确?
var int = 0
while int < 100 {
DispatchQueue.main.asyncAfter(deadline: .now() + int) { // change 2 to desired number of seconds
// do stuff
}
int += 1
}
代码正在applicationDidEnterBackground的调度队列中运行,以尝试在后台进行文本到语音转换。
4条答案
按热度按时间ymzxtsji1#
DispatchTime
和Int
。1.由于事实1,Swift不知道如何解释
.now()
。DispatchTime
和Int
**这可以通过以下方式证明:
二元运算符"+"不能应用于"DispatchTime"和"Int"类型的操作数
但Swift知道如何添加
DispatchTime
和Double
:这可以很好地编译,没有错误。
那么
DispatchQueue.main.asyncAfter(deadline: .now() + 5)
为什么能工作呢?在本例中,Swift将整数字面值
5
解释为Double
。类型Double
符合协议ExpressibleByIntegerLiteral
,它允许您执行以下操作:在本例中,它起作用是因为
5
不是Int
,而是Double
。.now()
**当您尝试将
Int
添加到.now()
时:Swift类型推理系统被弄糊涂了,Swift知道它想把一个
DispatchTime
传递给asyncAfter(deadline:)
,但是它不能再弄清楚.now()
是什么,因为没有办法把DispatchTime
和Int
相加得到DispatchTime
,它判定.now()
不是DispatchTime
,而是其他未知类型,因此模糊的错误消息来自Swift无法确定.now()
是什么。如果您通过
DispatchTime.now()
来明确表示这一点,则会得到一个更明显的错误:二元运算符"+"不能应用于"DispatchTime"和"Int"类型的操作数
作为这个理论的进一步证据,如果你向Swift提供一种添加
DispatchTime
和Int
的方法,Swift会对你的原始代码感到满意:那么
.seconds()
是什么东西呢?它如何帮助解决错误呢?有一个相关的
enum
类型DispatchTimeInterval
,它有microseconds(Int)
,milliseconds(Int)
,nanoseconds(Int)
,seconds(Int)
和never
,Swift知道如何添加DispatchTime
和DispatchTimeInterval
,因此Swift能够将.seconds(int)
解释为DispatchTimeInterval
,然后允许它将.now()
解释为DispatchTime
。为什么Swift的设计者选择让您将
Double
添加到DispatchTime
,而不是Int
?我怀疑他们选择
Double
是出于方便(允许使用像2.5
这样的文字值),也是因为它允许您指定小于1秒的时间间隔。Int
没有给您任何额外的功能(当然,除了消除这个非常混乱的错误消息)。错误来自这样一个事实,即您试图将
Int
添加到DispatchTime
,从而混淆了Swift的类型推理系统。其他答案建议的修复方法:
1.使用
Double
。1.使用
DispatchTimeInterval
enum
来明确地指出你的Int
代表什么。7ivaypg92#
您需要使用一个 double 变量来添加到
.now()
。cbwuti443#
您可以使用文字执行
DispatchTime
数学运算但不能用
Int
变量,这就是歧义。有一个DispatchTimeInterval
枚举能够传递Int
变量lymnna714#
我得到了同样的错误,对我来说,这段代码工作