【发布时间】:2014-06-13 11:48:11
【问题描述】:
这感觉很基础。我提前道歉。但请考虑同一主题的以下四种变体:
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 为假,{Somewhatever} 为真?为什么第三个 if 语句在语义上与其他语句相同时打印“nil is not nil”?为什么当绑定到变量或 let 表达式时,在 if 语句中 nil 可接受/可转换为 LogicValue,但在以文字形式呈现时不可接受?
【问题讨论】:
-
第三个
if打印nil is non-nil看起来很像编译器中的错误。您是否向 Apple 报告了此事? -
(不……我想我一定错过了什么。这是我第一次玩 swift;如果有疑问,我认为我错了。)
-
通常情况下,这是一个非常聪明的假设。 Beta 测试是该规则的一个显着例外;-)
-
是否有任何关于
if let z : String? = q应该做什么的文档,而不是if let z = q,如果 q 不是 nil 则返回 true 并将 q 解包到 z 中? -
关于
if nil... if 语句需要一个布尔值。 nil 不是布尔值
标签: swift