我的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
它完美无缺。我不确定为什么呢?
答案 0 :(得分:3)
正如在其他答案中已经解释的那样,比较可选项
对NSURL?
或true
的{{1}}不是你想要的,你应该这样做
改为使用可选的绑定。
但为什么要编译呢?如何解释结果?
在false
中,左侧有类型
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'
或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语句可确保您创建的NSURL
和NSData
对象是非零且有效的对象,然后您可以向它们添加else
语句处理url
或data
个对象为零的情况。这样可以避免由于使用!
运算符强行解包而造成的意外崩溃。
答案 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
在任何情况下,它都不会返回nil
或true
。因此,当您将其与false
进行比较时,它始终会失败并转到true
阻止。
当你检查它不等于false(!= false)时,因为else
返回NSURL(string: urlString)
对象并且不等于false。
因此,如果您想检查是否创建了NSURL
对象,您可以检查返回值是否为NSURL
。
nil