这感觉非常基本。我提前道歉。但请考虑同一主题的以下四种变体:
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,而不是作为文字表示时?
答案 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 可选的返回nil
和nil
已经过测试。单独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
。
对于最后一种情况,
表达式必须是bool
。 if q
编译的原因是它为你检查nil
并仍然返回一个布尔值。