2014-09-22 16 views
5

mam następujący wiersz:szybka obsługa NSData inicjalizacji nie

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

To kompiluje i wykonuje dobrze, ale jeśli inicjalizacja NSData nie otrzymuję wyjątek później w kodzie. Próbowałem dodać kolejny wiersz:

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

ale wtedy kompilator narzeka "Cannot invoke '!=' with an argument list type '(NSData, NilLiteralConvertible)"

nie powinien kompilator rozpoznać NSData initialiser typ zwracany jako opcja?

+0

Jeśli pierwsza linia zmienia się na 'niech jsonResults: NSData! = NSData (contentsOfURL: ... 'może sprawdzić' if jsonResults! = Nil {... 'i działa poprawnie, gdy NSData() zawodzi Jeśli tak NSData nigdy nie zwraca nil !? – user2041042

+0

ponieważ' NSData() 'jest konstruktorem, nie metoda.Odnosi odwołanie bieżącego obiektu –

+0

Potrafię odróżnić metodę i konstruktora.W moim poprzednim komentarzu, gdy jsonResults == zero, oznacza to, że NSData() zwrócił zero ... – user2041042

Odpowiedz

2

NSData inicjator nigdy nie wróci nil. Z drugiej strony podczas pisania jsonResults != nil oznacza się, że jsonResults ma być opcjonalne, ale nie jest.

Warunek if jsonResults != nil {} nie ma sensu.

Zamiast można sprawdzić liczbę bajtów zawartych przez obiekt danych jsonResults.length


Kiedy używać if != nil oświadczenie?

Rozważmy następujący przykład:

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. 
} 

uwaga: Od jsonResults jest stała (aka let) jego tylko do odczytu zmienna i nie można go zmienić w przyszłości, nawet jeśli ta wartość dostał nil


referencyjny

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

sprawdzić długość danych: if(data.length > 0) ...