Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在swift中,在单个if结构中比较非可选bool是错误的_Swift_Mapper - Fatal编程技术网

什么';在swift中,在单个if结构中比较非可选bool是错误的

什么';在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

我用Swift编码已经有一段时间了,我想我必须把一个!在所有未立即定义的let字段变量上

现在我注意到这段代码没有编译,我真的很惊讶?为什么会这样

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")
}