我的 Swift 应用程序中有这段代码
func parseJSON() {
let urlString = "www.websitethatlinkstoJSONfile.com"
if NSURL(string: urlString) == true {
let url = NSURL(string: urlString)
let data = try? NSData(contentsOfURL: url!, options: []) as NSData
let json = NSData(data: data!)
//更多代码
然而,即使链接确实有效并且是正确的,但从未遇到过 if 语句,它一直跳过它并移动到 else。所以我把代码改成了
if NSURL(string: urlString) != false
而且效果很好。我不确定为什么?
最佳答案
正如其他答案中已经解释的那样,比较可选的
NSURL?
反对 true
或 false
不是你想要的,你应该
改用可选绑定(bind)。
但为什么它能编译呢?以及如何解释结果?
在 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'
备注:这是不比较 boolean 值的另一个论点
针对 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
关于swift - swift 中 == true 和 != false 之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38637560/