2015-07-29 4 views
14

Non voglio passare nessuna opzione quando deserializza JSON in Swift (2.0). Originariamente ho provato:Come passare nessuna opzione a NSJSONSerialization.JSONObjectWithData in Swift

NSJSONSerialization.JSONObjectWithData(data, options: nil) 

Ma questo non si compila, ottengo l'errore:

Type NSJSONReadingOptions does not conform to protocol NilLiteralConvertible

L'enum NSJSONReadingOptions non ha alcuna opzione 'Nessuno', quindi cosa devo fare se ho non vuoi nessuna di queste opzioni?

risposta

20

a Swift 2 si dovrebbe usare l'array vuoto [] per indicare no options:

NSJSONSerialization.JSONObjectWithData(data, options: []) 
+0

che sembra funzionare, può mi indichi tutta la documentazione sul perché posso passare [] quando si aspetta un'enumerazione? – markdb314

+0

@ markdb314 stavo solo cercando un collegamento doc, datemi un secondo. – luk2302

+0

@ markdb314 sfortunatamente non riesco a trovare alcun documento sul perché funzioni, ma puoi essere sicuro che è la strada da percorrere, guarda un'altra risposta dove le opzioni dovrebbero essere date e [] viene consegnato. Immagino che abbia qualcosa da fai con 'RawOptionSetType' che la ** struct ** (non enum)' NSKeyValueObservingOptions' è conforme a -> http://nshipster.com/rawoptionsettype/ – luk2302

1

È anche possibile utilizzare un costruttore vuoto per l'oggetto NSJSONReadingOptions.

NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) 
8

tldr; Swift 3: salta le opzioni param e tutto andrà bene.

JSONSerialization.jsonObject(with: data) 

Spiegazione:

a Swift 3, la chiamata di funzione è

class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> AnyObject 

ReadingOptions è un gruppo di opzioni, l'intestazione per l'opzione Impostare il protocollo ha

/// When you need to create an instance of an option set, assign one of the 
/// type's static members to your variable or constant. Alternately, to create 
/// an option set instance with multiple members, assign an array literal with 
/// multiple static members of the option set. To create an empty instance, 
/// assign an empty array literal to your variable. 
/// 
///  let singleOption: ShippingOptions = .priority 
///  let multipleOptions: ShippingOptions = [.nextDay, .secondDay, .priority] 
///  let noOptions: ShippingOptions = [] 

Il option set docs are here

che significa che si può chiamare

JSONSerialization.jsonObject(with: data, options: []) 

tuttavia, le opzioni già ha il default [] definiti nella definizione della funzione, in modo da poter saltare del tutto e chiamare

JSONSerialization.jsonObject(with: data)