2016-07-28 80 views
3

我有这个代码在我的雨燕应用在swift中,== true和!= false是否有区别?

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 NSURL(string: urlString) != false 

它完美地工作。我不确定为什么?

+0

对于任何字符串,NSURL(string:)将返回true,无论它是有效的url还是只是radom字符。 – Khundragpan

+0

在此类情况下,Swift鼓励使用guard语句来检查nil。你也可能想研究Equatable协议以备将来参考。 –

回答

1

创建NSURL时,您并不想检查布尔值,而是确保您创建的NSURL非零。尝试将它包装在if语句中,以确保在执行进一步的代码之前,您创建的任何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 
    } 

使用,如果让说明这种方式可以确保您所创建的NSURLNSData对象是非零和有效的对象,然后你可以添加一个else声明,他们处理的情况下你urldata对象是零。这可以帮助您避免由于运算符强行解包而导致不必要的崩溃。

+0

当我使用'''如果让数据=尝试? NSData(contentsOfURL:url,options:[])as? NSData {''它表示从'NSData'到'NSData'的条件转换总是成功的。 – cheesydoritosandkale

+0

我删除了'as? NSData'从我的答案。这是从我的代码中复制出来的不必要的代码。 – NSGangster

+0

这工作!谢谢!!!现在我的如果和我的其他人在工作。感谢帮助! – cheesydoritosandkale

1

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

方便市民的init(字符串URLString:字符串)?

的问号表明它可能是错误的。

所以它会返回一个NSURL对象或为零。

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

'NSURL.init(string:)'返回'NSURL'对象或'nil'。它不会返回“false”。 – OOPer

+0

这就是为什么说“以某种方式”来帮助他们理解“在某种程度上” – Asdrubal

+0

在这里不适合。因为将'NSURL?'与'false'比较永远不会被认为是“相等的”。 – OOPer

3

正如在其他的答案已经解释过测试,比较可选 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 回报false

对于不是从NSObject继承类就不会编译:

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

备注:这是比较布尔值 对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 
+0

感谢您的真棒解释!我是新来的快,我感谢你打破这一点。 – cheesydoritosandkale

1

==运营商检查两侧值是否等于或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 
} 

!=操作员检查两个值是否彼此不相等。例如:

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那么它应该EXCUTE if块否则else块。

NSURL(string: urlString)是创建NSURL对象并返回的便利初始值设定项。在情况下,如果不这样做,那么它回报nil

在任何情况下,它不会返回任何truefalse。所以,当你比较这与true它总是失败,去else块。

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

因此,如果您想检查是否创建了NSURL对象,您可以检查返回值是否为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. 
} 
相关问题