よくわからない挙動。
オブジェクトのプロパティの値を見て、挙動を変えたいこんな感じのコード。
/** swift property atomic test */
class Test {
var isRunning:Bool?
init() {
isRunning = false
}
func toggle() -> Bool {
if isRunning {
println("Run")
isRunning = false
} else {
println("Stop")
isRunning = true
}
return true
}
}
var Tes = Test()
println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna true") // wanna true
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
実行
$ ./prop
isRunning => false == wanna false
Run
isRunning => false == wanna true
Run
isRunning => false == wanna false
期待としては isRunning の値の変化で Stop
=> Run
となって欲しかったけど、実際は二回とも Run
=> Run
になっている。
推察からした対処コード
おそらく、 var isRunning:Bool?
としたので値があるかないかだけを見たのじゃないか、と思い下記のコードを実行
/** swift property atomic test */
class Test {
var isRunning:Bool!
init() {
isRunning = false
}
func toggle() -> Bool {
if isRunning {
println("Run")
isRunning = false
} else {
println("Stop")
isRunning = true
}
return true
}
}
var Tes = Test()
println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna true") // wanna true
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
実行
$ ./prop
isRunning => false == wanna false
Run
isRunning => false == wanna true
Run
isRunning => false == wanna false
期待通り動きませんでした
実際に期待通り動いた対処コード
/** swift property atomic test */
class Test {
var isRunning:Bool?
init() {
isRunning = false
}
func toggle() -> Bool {
if isRunning == true {
println("Run")
isRunning = false
} else {
println("Stop")
isRunning = true
}
return true
}
}
var Tes = Test()
println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna true") // wanna true
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
実行
$ ./prop
isRunning => false == wanna false
Stop
isRunning => true == wanna true
Run
isRunning => false == wanna false
ちゃんと比較演算子を指定すれば、 Stop
=> Run
となった。