2016-07-28 1 views
3

私は文が満たされないと、それはそれをスキップし、移動保管なかった場合、リンクは実際に働いて、本当だったにもかかわらず、私のスウィフトのApp即時に== 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:)'は、有効なurlまたはradom文字であれば、どの文字列でもtrueを返します。 – Khundragpan

+0

このような状況では、Swiftではガードステートメントを使用することをお勧めします。また、将来の参照のためにEquatableプロトコルを調べることもできます。 –

答えて

1

NSURLを作成するときに真にブール値をチェックするのではなく、作成するNSURLがnilでないことを確認してください。それをif文でラップしてみてください。こうすることで、あなたが作成したURLが、それ以上のコードを実行する前に非nilであることを確認してください。

このようにしましょう文が作成している NSURLNSDataオブジェクトがnil以外、有効なオブジェクトであることを確認した後、あなたの urldata例を処理するために、それらに else文を追加することができた場合に使用
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 
    } 

オブジェクトはゼロです。これにより、!オペレータによる強制アンラッピングによる望ましくないクラッシュを防ぐことができます。

+0

let data = tryの場合に '' 'を使用するとどうなりますか? NSData(contentsOfURL:URL、オプション:[])? NSData {'' 'それは 'NSData'から 'NSData'への条件付きキャストは常に成功すると言います。 – cheesydoritosandkale

+0

私は 'as?私の答えから「NSData」。あなたのコードからコピーしたものは不要でした。 – NSGangster

+0

これはうまくいった!ありがとうございました!!!今、私と他の人が働いています。ヘルプをよろしく! – cheesydoritosandkale

1

はいいくつかのドキュメントを見てください。このinitメソッドでは失敗します。

公共コンビニのinit(文字列URLString:文字列)?

疑問符が、それは誤りを犯しがちであることを示します。

したがって、NSURLオブジェクトまたはnilを返します。

convenience init?(parameter: AnyObject) { 
    if parameter == nil { 
     return nil 
    } 
    self.init() 
} 

したがって、例のような具体例では、あなたはtrueまたはfalseに対するオプション NSURL?を比較すると、あなたが望むものではない、とあなたは 代わりに、オプションのバインディングを使用する必要があり、すでに他の回答で説明した遊び場で

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(string: urlString) == true

、左側タイプ NSURL?を有し、そしてNSURLNSObjectのサブクラスです。

public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool 

コンパイラはそのコンパイルをするためにNSNumberBool暗黙的な変換を使用しています。 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 == truex == 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 
+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 
} 

!=オペレータは、2つの値が互いに等しくないかどうかをチェックします。例:

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それはそうelseブロックifブロックをexcute必要がある場合に。

NSURL(string: urlString)NSURLオブジェクトを作成して返す便利なイニシャライザです。ケースでは、それ戻りnil

ので、次に行うに失敗した場合、いずれにせよ、それはどちらかtruefalse。だからあなたはそれがいつも失敗してelseブロックに行くtrueでこれを比較したときには戻りません。

NSURL(string: urlString)NSURLというオブジェクトを返すため、falseでないことをチェックすると(!= false)、それは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. 
} 
関連する問題