2014-10-02 63 views
0

隐含解缠在阵营"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?() 
} 

失败(与“可选类型的值双?不解开”)?

回答

1

这是因为如果lastTicknil,编译器会不知道如何处理这样的表达:

nil * -1000.0 

所以必须使用非可选值。

它工作在第一种情况:

if lastTick == nil { 
    return 
} 
var timePassed = lastTick!.timeIntervalSinceNow * -1000.0 

因为timePassed是不可选的(这里使用强制解包是安全的感谢前面if检查)。

它也可以在第二种情况:

if let timePassed = lastTick?.timeIntervalSinceNow { 

因为可选的结合确保只有在右边的表达式计算为一个非零值

+0

我不认为这是真的。如果'lastTick'是'nil','lastTick?.timeIntervalSinceNow'的计算结果为'nil',但省略* -1000.0'不会产生错误('>'工作)。所以问题是'*'操作,我想。 – orome 2014-10-02 17:48:25

+0

是正确的,因为如果nil * -1000.0> tickLengthMillis'''',但'''nil * -1000.0''的值无法确定,请参阅[我的答案](http:/ /stackoverflow.com/a/26166511/2147244)以上详细信息 – 2014-10-02 18:08:20

+0

@raxacoricofallapatorius是的,这是正确的,我的错误 - 但错误的来源仍然是一样的:'lastTick'是一个可选项。感谢您发现错误,我已经相应地更新了我的答案 – Antonio 2014-10-02 18:33:05

0

我的理解if分支被执行是if必须有一个条件来测试,但它不会在可选的情况下为空。

让我们把你的if语句:

if lastTick?.timeIntervalSinceNow * -1000.0 > tickLengthMillis { 
    lastTick = NSDate.date() 
    tick?() 
} 

存在两种可能性:

  1. lastTick有一个值 - if语句然后可以改写为if a > b
  2. lastTick是空的 - 如果陈述将是没有意义的,因为它会是if ??? > b,我想这种行为是不确定的。

编译器试图在安全的一面并发出错误。

UPDATE

if lastTick?.timeIntervalSinceNow * -1000.0 > tickLengthMillis

万一当lastTick?是空的可以改写为

if nil * -1000.0 > tickLengthMillis

其中nil * -1000.0值是不确定的。

+0

第一个版本如何?这相当于原来的,对吗? – orome 2014-10-02 17:49:16

+0

看起来相当于我。 #1和#2之间的区别在于,如果让timePassed = lastTick?.timeIntervalSinceNow'''开始解压缩可选的''',然后可以安全地使用它。 – 2014-10-02 18:06:15