2014-09-22 10 views
5

Ich habe die folgende Zeile:rasche NSData Initialisierung Handhabung nicht

let jsonResults = NSData(contentsOfURL: Fetcher.URLforLicenseInfo()) 

Dies kompiliert und führt in Ordnung, aber wenn die Initialisierung von NSData versagt ich eine Ausnahme später im Code. Ich habe versucht, eine weitere Zeile hinzufügen:

if jsonResults != nil { ///blah, blah... 

aber dann der Compiler beschwert sich "Cannot invoke '!=' with an argument list type '(NSData, NilLiteralConvertible)"

Sollte nicht der Compiler NSData initialiser Rückgabetyp als optionales erkennen?

+0

Wenn die erste Zeile zu 'geändert wird jsonResults lassen: NSData! = NSData (contentsOfURL: ... 'kann' überprüfen, wenn jsonResults! = Nil {... 'und es funktioniert gut, wenn NSData() fehlschlägt. Warum, wenn NSData nie null zurückgibt !? – user2041042

+0

weil' NSData() 'ist ein Konstruktor, nicht Methode.Es gibt Referenz des aktuellen Objekts –

+0

Ich kann den Unterschied zwischen Methode und Konstruktor machen.In meinem früheren Kommentar, wenn JsonResults == Nil bedeutet es NSData() hat Nil zurückgegeben ... – user2041042

Antwort

2

NSData Initialisierer wird nie nil zurückgeben. Auf der anderen Seite, wenn Sie schreiben jsonResults != nil bedeutet, dass jsonResults erwartet wird, optional zu sein, aber es ist nicht.

Die if jsonResults != nil {} Bedingung macht keinen Sinn.

Stattdessen können Sie die Anzahl von Bytes, die von dem Datenobjekt jsonResults.length


Wann verwendet if != nil Anweisung enthalten überprüfen?

Betrachten Beispiel folgende:

func toJson() -> NSData? { 
    return nil // dummy 
} 

let jsonResults:NSData? = toJson() // jsonResults must be optional 

if jsonResults != nil{ 
    println(jsonResults!.length) // The number of bytes contained by the data object. 
} 

Vorsicht: Da jsonResults konstant ist (aka let) seine read-only Variable und Sie können es nicht einmal in der Zukunft ändern, wenn dieser Wert bekam nil


Referenz

extension NSData {  
    // ... 
    init(contentsOfURL url: NSURL) 
    // ... 
} 
3

Überprüfen Sie die Länge der Daten: if(data.length > 0) ...