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只需要用它定义赋值运算符