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

标签 swift conditional-statements option-type

在集团中"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/

相关文章:

swift - 类协议(protocol) : Cannot use mutating member on immutable value: 'self' is immutable

swift - 如何显示然后隐藏占据全屏的覆盖窗口

ios - 在 rtl 语言中,UISearchBar 文本不是从右到左开始的

haskell - (Haskell) 将函数类型转换为 maybe

java - Swift 的 "implicitly unwrapped optionals"与 Java 的整数 "autoboxing"有何不同?

java - do-while with Java8-Optional

ios - 终止 iOS 应用程序

python - 条件语句中多个 'or' 语句的有效方法

mysql - 在 MySQL 中使用条件连接连接三个表

mysql - mysql查询条件更新记录