将可选值表达式转换为布尔值

时间:2014-06-13 11:48:11

标签: 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 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) {

当可选表达式被视为布尔值时,有什么规则可以解释,nil为false,{Some whatever}为true?为什么第三个if语句打印&#34; nil不是nil&#34;什么时候它在语义上与其他人相同?当绑定到变量或let表达式时,为什么在if语句中nil可接受/可转换为LogicValue,而不是作为文字表示时?

2 个答案:

答案 0 :(得分:4)

第三种情况的结果是有道理的。 “如果让”正在测试作业是否成功。正常模式是:

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语句中使用它。 NOT 可选的返回nilnil已经过测试。单独nil不能在if语句中使用,因为它没有实现LogicValue协议,并且没有理由这样做。

答案 1 :(得分:3)

您的Optional Binding语法不正确。

应为if let z = q {}

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

如果你这样做,

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

此行为正确并打印nil is nil

对于最后一种情况, 表达式必须是boolif q编译的原因是它为你检查nil并仍然返回一个布尔值。