Swift assert() 无法与 nil 进行简单比较

Swift assert() not working with simple comparison to nil

这让我很生气。

这是在 Swift 中键入 assert 后的 XCode 6.4 自动完成:

assert(condition: Bool, message: String)

这是我在 init 中使用它的方式:

required init (mainController: MainVC) {
   assert(mainController.parameterThatShouldNotBeNil != nil,
      "oops parameterThatShouldNotBeNil is nil")
   super.init()
}

这是来自红色小感叹号的错误消息:

Cannot invoke 'assert' with an argument list of type '(Bool, String)'

...让我拔头发。 Double You Tee Eff?

编辑

这是一个可以粘贴到 XCode 中的简短示例:

class HasNoNil {
  var definitelyNotNil: String = "nope not nil"
}

class ChecksForANil{
  init (objectToCheck: HasNoNil){
  assert(objectToCheck.definitelyNotNil != nil, "whoops it actually is nil")
  }
}

这给出了与我看到的相同的错误。

潜在的问题是 Swift 无法将非可选值与 nil 进行比较,主要是因为这种比较没有意义:它不是可选的,所以它不能可能是 nil,你可以在编译时解决这个问题(或者更确切地说,在非可选和 nil 之间没有设置 != 的重载,因为不需要。)

如果您尝试一个没有断言的更简单的示例:

class HasNoNil {
    var definitelyNotNil: String = "nope not nil"
}

class ChecksForANil{
    init (objectToCheck: HasNoNil){
        if (objectToCheck.definitelyNotNil != nil) { println("Not nil") }
        // assert(objectToCheck.definitelyNotNil != nil, "Hrm")
    }
}

...你会得到一个更明智的错误:"Could not find an overload for '!=' that accepts the supplied arguments"。 (Xcode 6.2/Swift 1.2) 如果您将 definitelyNotNil 设为可选,那么一切正常。

所以,我认为这只是一个误导性的错误消息。可悲的是,当问题出在函数的参数上时,这种误导性错误在早期 Swift 编译器中似乎相当普遍。您可能想在 Swift 2 下尝试,如果尚未修复,请向 Apple 报告。