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 报告。
这让我很生气。
这是在 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 报告。