2014-09-22 17 views
5

Ho la seguente linea:movimentazione NSData inizializzazione rapida non riesce

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

Questo compila ed esegue bene, ma se l'inizializzazione di NSData non ottengo un'eccezione più avanti nel codice. Ho cercato di aggiungere un'altra linea:

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

ma poi il compilatore si lamenta "Cannot invoke '!=' with an argument list type '(NSData, NilLiteralConvertible)"

Non dovrebbe riconoscere il compilatore NSData initialiser tipo di ritorno come optional?

+0

Se la prima riga viene modificato in 'lasciare jsonResults: NSData! = NSData (contentsOfURL: ... 'può controllare' if jsonResults! = Nil {... 'e funziona bene quando NSData() fallisce. Perché se NSData non restituisce mai nulla !? – user2041042

+0

perché' NSData() 'è costruttore, non metodo, restituisce il riferimento dell'oggetto corrente –

+0

Posso fare la differenza tra metodo e costruttore Nel mio precedente commento quando jsonResults == nil significa NSData() ha restituito nil ... – user2041042

risposta

2

NSData l'inizializzatore non restituirà mai nil. D'altra parte quando scrivi jsonResults != nil significa che jsonResults dovrebbe essere opzionale ma non lo è.

La condizione if jsonResults != nil {} non ha senso.

Invece è possibile controllare il numero di byte contenuti da l'oggetto di dati jsonResults.length


Quando usare if != nil affermazione?

Consideriamo seguente esempio:

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

Attenzione: Dal jsonResults è costante (aka let) la sua sola lettura variabili e non si può cambiare in futuro, anche se questo valore ottenuto nil


Riferimento

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

controllo la lunghezza dei dati: if(data.length > 0) ...