swift - swift 中 == true 和 != false 之间有区别吗?

标签 swift xcode if-statement boolean nsurl

我的 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? 反对 truefalse 不是你想要的,你应该 改用可选绑定(bind)。

但为什么它能编译呢?以及如何解释结果?

NSURL(string: urlString) == true 中,左侧有类型 NSURL?NSURLNSObject 的子类。 有一个 == 运算符采用两个可选操作数:

public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

编译器使用 隐式转换 BoolNSNumber 进行编译。所以你的代码等同于

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 == truex == false 返回 false

对于不是从 NSObject 继承的类,它不会编译:

class A { }
let a: A? = A()
if a == true { } // cannot convert value of type 'A?' to expected argument type 'Bool'

备注:这是比较 boolean 值的另一个论点 针对 truefalse,即

 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/

相关文章:

ios - Swift NSMutableAttributedString 导致在事务中调用 +[CATransaction synchronize]

objective-c - 我在 cornerstone 中看不到库 (.a),所以我无法添加它

iphone - 在 iPhone 上运行时内存泄漏

ios - 从上一个 Controller 导航回来时的 ViewController

c - 检查共享内存中的值的 if 语句有什么问题?

arrays - 具有特定类型的对象数组

ios - 在出现键盘时处理 tableView contentInset

ios - 检查用户连续使用应用的天数

ios - 如何创建一个随机的 if else 语句 swift 3

从公共(public)数组读取时,javascript if 语句无法与 ifValid 一起使用