())? var tickLengthMillis = TickLengthL-6ren">
gpt4 book ai didi

swift - Swift 中隐式展开的惯用用法

转载 作者:行者123 更新时间:2023-11-30 10:21:42 25 4
gpt4 key购买 nike

在集团中"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 的值?未解包”)?

最佳答案

这是因为如果lastTicknil,编译器将不知道如何处理这个表达式:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com