这是驱动我的横幅。
下面是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下尝试一下,如果这个问题还没有解决,你可以向苹果报告。