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

时间:2016-07-28 13:17:21

标签: swift xcode if-statement boolean nsurl

我的Swift App中有这个代码

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语句从未被满足,并且它一直跳过它并转移到其他地方。所以我将代码更改为

if NSURL(string: urlString) != false 

它完美无缺。我不确定为什么呢?

4 个答案:

答案 0 :(得分:3)

正如在其他答案中已经解释的那样,比较可选项 对NSURL?true的{​​{1}}不是你想要的,你应该这样做 改为使用可选的绑定。

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

false中,左侧有类型 NSURL(string: urlString) == trueNSURL?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 { ... }

答案 1 :(得分:1)

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

   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语句可确保您创建的NSURLNSData对象是非零且有效的对象,然后您可以向它们添加else语句处理urldata个对象为零的情况。这样可以避免由于使用!运算符强行解包而造成的意外崩溃。

答案 2 :(得分:1)

是的,有一些不同看一些文档。在这种初始化方法中,它是错误的。

  

public convenience init?(string URLString:String)

问号表明它是错误的。

因此它将返回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//
}

答案 3 :(得分:1)

var data = {"result":[{"content":{"resources":[{"prop":[{"key":"BAR","value":"Bar getting better"},{"key":"FOO","value":"Foo is cool"}]}]}}]} var ar = data.result[0].content.resources[0].prop; var result = ar.reduce((r, e) => (r[e.key] = e.value, r), {}); console.log(result);运算符检查两个边值是否相等。例如:

==

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 } 运算符检查两个值是否彼此不相等。例如:

!=

在您的案例中,代码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),然后它应该true阻止if阻止。

else是便捷初始化程序,它创建NSURL(string: urlString)对象并返回。如果它没有这样做,那么它返回 NSURL

在任何情况下,它都不会返回niltrue。因此,当您将其与false进行比较时,它始终会失败并转到true阻止。

当你检查它不等于false(!= false)时,因为else返回NSURL(string: urlString)对象并且不等于false。

因此,如果您想检查是否创建了NSURL对象,您可以检查返回值是否为NSURL

nil