Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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 可选值表达式到布尔值的转换_Swift - Fatal编程技术网

Swift 可选值表达式到布尔值的转换

Swift 可选值表达式到布尔值的转换,swift,Swift,这感觉很基本。我提前道歉。但是在同一个主题上考虑以下四个变化: var q : String? = nil if let z : String? = q { println("q is non-nil") } else { println("q is nil") } var zz : String? = nil if (zz) { println("zz is not nil") } else { println("zz is nil") } if let

这感觉很基本。我提前道歉。但是在同一个主题上考虑以下四个变化:

var q : String? = nil

if let z : String? = q {
    println("q is non-nil")
} else {
    println("q is nil")
}

var zz : String? = nil
if (zz) {
    println("zz is not nil")
} else {
    println("zz is nil")
}

if let z : String? = nil {
    println("nil is non-nil")
} else {
    println("nil is nil")
}

/*
if (nil) {
    println("nil is non-nil")
} else {
    println("nil is nil")
}
*/
天真地说,我认为这些行为应该是一致的。但是输出是

q is nil
zz is nil
nil is non-nil
如果我取消对最终表单的注释,我会得到

Playground execution failed: error: <REPL>:57:5: error: type 'NilType' does not conform to protocol 'LogicValue'
if (nil) {
执行失败:错误::57:5:错误:类型“NilType”不符合协议“LogicValue”
如果(无){

当一个可选表达式可以被视为布尔表达式,nil为false,{Some whatever}为true时,有什么规则可以解释?为什么第三个if语句打印“nil不是nil”当它在语义上与其他语句相同时?为什么在绑定到变量或let表达式时,nil在if语句中是可接受的/可转换为LogicValue的,但在以文本形式呈现时却不是这样?

您的
可选绑定
语法不正确

如果让z=q{}

如果必须添加类型,则应为:
If let z:String=q

如果你这样做

if let z : String = nil {
    println("nil is non-nil")
} else {
    println("nil is nil")
}
这将正确运行并打印
nil为nil

对于最后一个案例,
表达式必须是
bool
。如果q编译,则
的原因是它为您检查
nil
,并且仍然返回布尔值。

第三种情况的结果是有意义的。“if let”正在测试赋值是否成功。正常模式是:

var optional : String?
if let nonOptional : String = optional {
    // the optional could successfully be converted to a non-optional
}
您只是试图将nil赋值给一个可选值,这确实是可能且有效的。因此,“let if”返回true

同样的事情也经常发生在下投作业中

var any : AnyObject = "Hello"
if let string = any as? String {
     // Downcast to String was successful
}

最后,它是符合
LogicValue
的可选类型,允许在
if
语句中使用它。可选类型返回
nil
并测试
nil
nil
不能在if语句中单独使用,因为它没有实现<代码>逻辑值
协议,没有理由这样做。

第三个
如果
打印
nil是非nil
看起来很像编译器中的一个bug。你向苹果报告了吗?(不……我想我一定错过了什么。这是我第一次玩swift;如果有疑问,我想我错了。)通常,这是一个非常明智的假设。Beta测试是该规则的一个显著例外;-)有没有关于
如果让z:String?=q
应该做什么的文档,而不是
如果让z=q
,有很好的文档记录,如果q为非零,则返回true并将q展开为z?关于
if-nil
…if语句需要一个布尔值。nil不是布尔值。谢谢。但是nil不需要符合可选类型本身,所以如果Optional需要符合逻辑值协议,它不需要实现逻辑值协议吗?(如果我遗漏了一些非常基本的内容,请再次道歉。)@SteveWaldman nil不需要符合Optional,Optional只需要用它定义赋值运算符