2015-11-03 25 views
5

ho seguito cercare di convertire un dizionario per NSData:Swift: Tipo di argomento '[String: ValueType]' non è conforme al tipo previsto 'ANYOBJECT' codice

func dataFromDict<ValueType>(dict: [String:ValueType]) -> NSData { 
    return NSKeyedArchiver.archivedDataWithRootObject(dict) 
} 

Il compilatore mi dà questo errore per il passaggio dict come argomento:

Argument type '[String:ValueType]' does not conform to expected type 'AnyObject'

Edit:

@v la soluzione di Adian ha funzionato per me.

Ho anche provato a lanciare il dict a NSDictionary:

return NSKeyedArchiver.archivedDataWithRootObject(dict as NSDictionary) 

Ma ottenere questo errore:

Cannot convert value of type '[String:ValueType]' to type 'NSDictionary' in coercion

Perché?

+0

non buttare via le informazioni sul tipo. Si spera che si possano limitare i valori del dizionario di input ai tipi reali in modo da sapere come decodificarli in un secondo momento. Sì, è possibile utilizzare un cast per eliminare/ignorare l'avviso del compilatore, ma non risolve il problema reale. –

risposta

4

Dal archivedDataWithRootObject aspetta AnyObject appena gettato il dizionario

func dataFromDict<ValueType>(dict: [String:ValueType]) -> NSData { 
    return NSKeyedArchiver.archivedDataWithRootObject(dict as! AnyObject) 
} 
+0

Grazie, questo funziona per me. Sono ancora confuso perché il ditt non può essere lanciato su NSDictionary, però. – ubertao

+0

Il motivo è il tipo generico che non è correlato a 'NSDictionary'. Se dichiari il parametro come '[String: AnyObject]' senza un tipo generico non hai bisogno di cast 'dict' a tutti! – vadian

1

È possibile utilizzare NSJSONSerialization per convertire il dizionario in NSData. Prova questa

let params = ["key1":"1","key2":"0"] as Dictionary<String, AnyObject> 

let data = try? NSJSONSerialization.dataWithJSONObject(params, options:NSJSONWritingOptions.PrettyPrinted) as NSData 
+0

Non riesco a utilizzare 'AnyObject' perché l'altra parte del mio codice crea un'istanza della classe (contenente la funzione precedente) con tipo "Int". – ubertao

+0

In tal caso è possibile sostituire AnyObject di Int –

Problemi correlati