在集团中"Swiftris" Swift tutorial (step 5)我们被要求写
var tick:(() -> ())?
var tickLengthMillis = TickLengthLevelOne
var lastTick:NSDate?
override func update(currentTime: CFTimeInterval) {
if lastTick == nil {
return
}
var timePassed = lastTick!.timeIntervalSinceNow * -1000.0
if timePassed > tickLengthMillis {
lastTick = NSDate.date()
tick?()
}
}
update
的正文不能写成
if let timePassed = lastTick?.timeIntervalSinceNow {
if timePassed * -1000.0 > tickLengthMillis {
lastTick = NSDate.date()
tick?()
}
}
具有相同的效果。
如果是这样,为什么更紧凑且显然(对我来说)等效
if lastTick?.timeIntervalSinceNow * -1000.0 > tickLengthMillis {
lastTick = NSDate.date()
tick?()
}
失败(“可选类型 Double 的值?未解包”)?
最佳答案
这是因为如果lastTick
为nil
,编译器将不知道如何处理这个表达式:
nil * -1000.0
因此必须使用非可选值。
它适用于第一种情况:
if lastTick == nil {
return
}
var timePassed = lastTick!.timeIntervalSinceNow * -1000.0
因为 timePassed
不是可选的(由于前面的 if
检查,这里使用强制展开是安全的)。
它也适用于第二种情况:
if let timePassed = lastTick?.timeIntervalSinceNow {
因为可选绑定(bind)确保仅当右侧表达式计算结果为非零值时才执行 if
分支
关于swift - Swift 中隐式展开的惯用用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26166375/