什么';在swift中,在单个if结构中比较非可选bool是错误的
我用Swift编码已经有一段时间了,我想我必须把一个!在所有未立即定义的let字段变量上 现在我注意到这段代码没有编译,我真的很惊讶?为什么会这样什么';在swift中,在单个if结构中比较非可选bool是错误的,swift,mapper,Swift,Mapper,我用Swift编码已经有一段时间了,我想我必须把一个!在所有未立即定义的let字段变量上 现在我注意到这段代码没有编译,我真的很惊讶?为什么会这样 class MyClass : Mapper { var a: Bool! required init?(_ map: Map) { } // Mappable func mapping(map: Map) { a <- map["a"] } } let myClass
class MyClass : Mapper {
var a: Bool!
required init?(_ map: Map) {
}
// Mappable
func mapping(map: Map) {
a <- map["a"]
}
}
let myClass = MyClass()
if myClass.a { // Compiler not happy
// Optional type 'Bool!' cannot be used as a boolean; test for '!= nil' instead
}
if true && myClass.a { // Compiler happy
}
if myClass.a && myClass.a { // Compiler happy
}
classmyclass:Mapper{
var a:糟糕!
必需的初始化(umap:map){
}
//可映射
func映射(映射:映射){
a您可以声明让a:Bool
而不必声明!
,也不必立即声明true或false。如果编译器不能保证在您使用它之前设置了值,它会抱怨
这很有效
let a: Bool
a = true
if a { // Compiler happy
}
这同样有效,因为a
保证被设置
let a: Bool
if thingOne < thingTwo {
a = true
} else {
a = false
}
if a { // Compiler happy
}
现在,如果您不能保证您的变量在执行检查时会被设置,那么您首先应该使用可选的var
var a: Bool?
if a == true { // Compiler happy
}
一点历史
在Swift 1.0中,只需检查以下内容,即可检查可选变量optVar
是否包含值:
if optVar {
println("optVar has a value")
} else {
println("optVar is nil")
}
在Swift编程语言中,Swift 1.1的更新(日期为2014-10-16)说明:
选项有值时不再隐式计算为true
,没有值时不再隐式计算为false
,以避免在使用可选Bool
值时产生混淆。相反,请使用==
或!=
运算符显式检查nil
,以确定可选值是否包含价值观
因此,您收到的无意义的错误消息放在那里,因为Swift编译器正在解释您的:
if a {
}
意思是:
if a != nil {
}
它鼓励您针对nil
进行测试,以确定可选a
是否有值
也许Swift的作者将来会改变它,但现在你必须明确地打开a
:
if a! {
}
或对照true
:
if a == true {
}
或者(为了完全安全):
在if
和switch
语句中,隐式展开的选项不会自动强制展开(如果您自己使用它们)。这样您就可以安全地将它们与nil
进行比较。请参阅最短解决方法:如果是!{
Wow,这是高度不一致的,对代码审查者来说很可怕。他们会问我为什么不使用if-let
语句来防止崩溃。如果我使用if-true&&a
,我会被炒鱿鱼。为了安全起见,如果一个??false{
,这比if-let a=a更奇怪{
…如果大小写为真,也比好看?=a{
:)我很感谢你的回答。我无法摆脱!的主要原因是我使用的是ObjectMapper,建议在这种情况下使用!如果没有更多的上下文,很难说在你的情况下使用!
是否合适。特别是JSON序列化肯定存在一些奇怪的情况。 例如,NSJSONSerialization
,无法处理选项,而是需要NSNull
对象。根据您在那里做的工作以及ObjectMapper的工作方式,这可能是必要的。
if a == true {
}
if a ?? false {
print("this will not crash if a is nil")
}