swift中的== true 和 != false 有区别吗?

Is there a difference between == true and != false in swift?

我的 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!)

// 更多代码

然而,即使 link 确实起作用并且是真的,if 语句从未被满足,它一直跳过它并移动到 else。所以我将代码更改为

if NSURL(string: urlString) != false 

而且效果很好。我不确定为什么?

在创建 NSURL 时,您并不是真的想检查布尔值,而是要确保您创建的 NSURL 不为零。尝试将其包装在 if let 语句中,以确保在执行进一步代码之前创建的任何 URL 都不是 nil。

   let urlString = "www.websitethatlinkstoJSONfile.com"

    if let url = NSURL(string: urlString) {
       if let data = try? NSData(contentsOfURL: url, options: []) {
           let json = NSData(data: data)
       } else { 
          //Handle case where data is nil
       }
    } else { 
        //Handle case where url is nil 
    }

以这种方式使用 if let 语句可确保您正在创建的 NSURLNSData 对象是非零且有效的对象,然后您可以添加 else 语句给他们处理你的 urldata 对象为零的情况。这将使您免于因使用 ! 运算符强制展开而导致的意外崩溃。

是的,查看一些文档有不同的看法。在这个 init 方法中,它是容易出错的。

public convenience init?(string URLString: String)

问号表示它是错误的。

所以它将 return 一个 NSURL 对象或 nil。

convenience init?(parameter: AnyObject) {
    if parameter == nil {
        return nil
    }
    self.init()
}

所以在一个像你的例子这样的具体例子中。你可以在操场上测试它

let urlString = "100"

if NSURL(string: urlString) == true {
    print("true")
    //Never prints in any circumstance//
}


if NSURL(string: urlString) != false {
    print("true")
    //always prints//
}

if NSURL(string: urlString) != nil {
    print("true")
   //object was created//
}

正如其他答案中已经解释的那样,比较可选的 NSURL? 反对 truefalse 不是你想要的,你应该 改为使用可选绑定。

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

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 return false.

对于 类 不继承自 NSObject 它不会编译:

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

备注:这是not比较布尔值的另一个论据 反对 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

== 运算符检查两侧值是否相等或 not.For 示例:

var data:Int = 6
if data == 5 {
   //if this block is executed that means `data` is exactly equal to 5
   //do something
}
else {
    //In this situation, this block of code will be executed.
   //if this block is executed that means data is anything other than 5.
   //do something
}

!= 运算符检查两个值是否不等于每个 other.For 示例:

var data:Int = 6
if data != 5 {
    //In this situation, this block of code will be executed.
   //If this block is executed that means `data` is anything other than 5.
   //do something
}
else {
   //if this block is executed that means data is exactly equal to 5.
   //do something
}

在你的案例中,代码 if NSURL(string: urlString) == true 检查如果 NSURL(string: urlString) return true 那么它应该执行 if 块,否则 else 块。

NSURL(string: urlString) 是创建 NSURL 对象和 return 对象的便捷初始化器。如果它没有这样做,那么它 returns nil

在任何情况下,它都不会 return truefalse。所以当你将它与 true 进行比较时,它总是失败并转到 else块。

并且当您检查它不等于 false (!= false) 时变为 true 因为 NSURL(string: urlString) returning NSURL 对象并且不等于 false。

所以如果你想检查NSURL对象是否被创建,你可以检查return值是否是nil

if NSURL(string: urlString) != nil {
   //Object is created successfully.Now you can do whatever you want this object.
}
else {
   //It failed to create an object.
}