Swift:逻辑非运算符不工作

时间:2014-07-22 19:21:03

标签: swift

这段代码打印两次' false':

println(levelController?.died)
println(!levelController?.died)

我不明白为什么,levelController被实例化,并且在LevelController中声明了death属性,如下所示:

var died = false

有人可以告诉我,我可能做错了吗?

3 个答案:

答案 0 :(得分:3)

您可以这样创建自己的not运算符:

let not = (!)

现在我们可以指定一个布尔值来对此进行测试:

let dead = false

if not(dead) {
print(dead)
// Code
} else {
// Code
}

答案 1 :(得分:1)

这是Swift,而不是目标C.

levelController?.died不是布尔值。它是可选布尔值。它可能是真的,假的,或者是零。第一个println打印错误。应用于可选项的逻辑非运算符如果optional不是nil则返回false,如果optional是nil则返回true。就像在应用于指针时在C中一样。

答案 2 :(得分:0)

作为一个完整的例子,您的代码:

class Controller {
  var died: Bool = false
}

var levelController: Controller? = Controller()

println(levelController?.died)
println(!levelController?.died)

输出以下内容:

Optional(false)
false

代码的第一个版本levelController?.died使用选项链接,展开levelController并访问died属性。这解释了为什么输出为Optional(false)。您通常会按如下方式使用它:

if let died = levelController?.died {
  if (died) {
    println("I died")
  }
}

if-let语句展开此可选值。

代码的第二个版本!levelController?.died测试给定的可选值是否为nil。您会注意到将died更改为true的假设没有任何区别。

但是,更改实例化如下:

var levelController: Controller? = nil

!levelController?.died成为真的结果。这不是一个非常实用的代码片段!