それをテストすることができます。
しかし、なぜそれはまったくコンパイルされますか?結果はどのように解釈できますか? NSURL(string: urlString) == true
で
、左側タイプ NSURL?
を有し、そしてNSURL
はNSObject
のサブクラスです。
public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
コンパイラはそのコンパイルをするためにNSNumber
にBool
の暗黙的な変換を使用しています。 2つのオプションのオペランドを取る==
オペレータがあります。だからあなたのコードは
if NSURL(string: urlString) == NSNumber(bool: true)
に相当し、それは常にfalseになります、と
if NSURL(string: urlString) != NSNumber(bool: false)
は常に左側が 数ではないという理由だけで、trueになります。ここで
は効果のデモンストレーションです:
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'
備考:これはすなわち、
if a == true && b == false { ... }
true
または
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
'NSURL(string:)'は、有効なurlまたはradom文字であれば、どの文字列でもtrueを返します。 – Khundragpan
このような状況では、Swiftではガードステートメントを使用することをお勧めします。また、将来の参照のためにEquatableプロトコルを調べることもできます。 –