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 语句可确保您正在创建的 NSURL
和 NSData
对象是非零且有效的对象,然后您可以添加 else
语句给他们处理你的 url
或 data
对象为零的情况。这将使您免于因使用 !
运算符强制展开而导致的意外崩溃。
是的,查看一些文档有不同的看法。在这个 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?
反对 true
或 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
return false
.
对于 类 不继承自 NSObject
它不会编译:
class A { }
let a: A? = A()
if a == true { } // cannot convert value of type 'A?' to expected argument type 'Bool'
备注:这是not比较布尔值的另一个论据
反对 true
或 false
,即
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 true
或 false
。所以当你将它与 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.
}
我的 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 语句可确保您正在创建的 NSURL
和 NSData
对象是非零且有效的对象,然后您可以添加 else
语句给他们处理你的 url
或 data
对象为零的情况。这将使您免于因使用 !
运算符强制展开而导致的意外崩溃。
是的,查看一些文档有不同的看法。在这个 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?
反对 true
或 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
return false
.
对于 类 不继承自 NSObject
它不会编译:
class A { }
let a: A? = A()
if a == true { } // cannot convert value of type 'A?' to expected argument type 'Bool'
备注:这是not比较布尔值的另一个论据
反对 true
或 false
,即
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 true
或 false
。所以当你将它与 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.
}