3

私はSwift拡張機能をいじっていて、Boolを拡張しようとしているときに奇妙なバグに頭をぶつけました:

typealias Task = ()->()
extension Bool{
    func untilFalse(task: Task){

        while !self {println(self); task()}
    }
}

var i = 2

(i < 1).untilFalse{
    println(i)
    println("\(i) bottles of beer on the wall, \(i) bottles of beer.")
    i--
    println("Take one down and pass it around, \(i) bottles of beer on the wall.")
}

boolean何らかの理由で、式が になった後でもループが続くだけtrueです。

何が起こっているのでしょうか?

4

2 に答える 2

3

問題は、式i < 1が 1 回評価され、結果がfalse. 継続的に再評価されることはありません。これを実現するには、関数またはクロージャーに置き換える必要があります。

本当にやりたい場合は、次のようにコードを書き直すことができます。

typealias Task = ()->()
typealias BooleanExpression = () -> Bool

infix operator *** {}

func *** (b: BooleanExpression, t: Task) {
  while !b() { t() }
}

var i = 2

let exp: BooleanExpression = { i < 1 }
exp *** {
  println(i)
  println("\(i) bottles of beer on the wall, \(i) bottles of beer.")
  i--
  println("Take one down and pass it around, \(i) bottles of beer on the wall.")
}

しかし、それはかなり醜いです!

于 2014-09-15T20:44:15.693 に答える