正如在其他的答案已经解释过测试,比较可选 NSURL?
针对true
或false
是不是你想要什么,你应该使用 可选绑定来代替。
但为什么它编译呢?如何解释结果?
在NSURL(string: urlString) == true
,左手侧具有类型 NSURL?
,和NSURL
是NSObject
一个子类。 有一个==
运营商采取两种可选的操作数:
public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
编译器使用的Bool
到NSNumber
的隐式转换来作出这样的编译。所以,你的代码就相当于
if NSURL(string: urlString) == NSNumber(bool: true)
,这将永远是假的,
if NSURL(string: urlString) != NSNumber(bool: false)
永远是真实的,仅仅是因为左侧是不是 数。
这里是效果演示:
func foo(x: NSObject?) {
print(x == true, x == false)
}
foo(NSNumber(bool: true)) // true, false
foo(NSNumber(bool: false)) // false, true
foo(NSObject()) // false, false !!!
最后一种情况是你观察到的:两个x == true
和x == false
回报false
。
对于不是从NSObject
继承类就不会编译:
class A { }
let a: A? = A()
if a == true { } // cannot convert value of type 'A?' to expected argument type 'Bool'
备注:这是不比较布尔值 对true
或false
另一种说法,即
if a == true && b == false { ... }
最好写成
if a && !b { ... }
适用于你的情况,你会得到指示 问题的一个编译器错误:
let urlString = "http://www.websitethatlinkstoJSONfile.com"
if NSURL(string: urlString) { }
// error: optional type '_' cannot be used as a boolean; test for '!= nil' instead
对于任何字符串,NSURL(string:)将返回true,无论它是有效的url还是只是radom字符。 – Khundragpan
在此类情况下,Swift鼓励使用guard语句来检查nil。你也可能想研究Equatable协议以备将来参考。 –