Swift assert()不能与nil进行简单的比较



这是驱动我的横幅。

下面是XCode 6.4在Swift中输入assert的自动完成:

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)'

…让我抓狂。加倍你的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 a overload for ! "='接受提供的参数'。(Xcode 6.2/Swift 1.2)如果你把definitelyNotNil设置为可选,那么一切都可以正常工作。

所以,我认为这只是一个误导性的错误信息。可悲的是,当问题与函数的参数有关时,这种类型的误导性错误似乎在早期的Swift编译器中相当普遍。你可以在Swift 2下尝试一下,如果这个问题还没有解决,你可以向苹果报告。

相关内容

  • 没有找到相关文章

最新更新