2015-11-03 12 views
5

ich folgenden Code haben versucht, ein Wörterbuch zu NSData konvertieren:Swift: Argumenttyp ‚[String: Valuetype]‘ entspricht nicht erwarteten Typ ‚ANYOBJECT‘

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

Der Compiler mir diesen Fehler für Vergehen gibt dict als Argument:

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

bearbeiten:

@v Adians Lösung funktionierte für mich.

Ich habe auch versucht die dict NSDictionary würfen

return NSKeyedArchiver.archivedDataWithRootObject(dict as NSDictionary) 

Aber immer diese Fehlermeldung:

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

Warum?

+0

Sie Typinformationen nicht wegwerfen. Hoffentlich können Sie Ihre Eingabewörterbuchwerte auf tatsächliche Typen beschränken, so dass Sie später wissen, wie Sie sie dekodieren. Ja, Sie können eine Umwandlung verwenden, um die Compiler-Warnung zu beseitigen/zu ignorieren, sie löst das eigentliche Problem jedoch immer noch nicht. –

Antwort

4

Seit archivedDataWithRootObject erwartet AnyObject werfen nur das Wörterbuch

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

Danke, das funktioniert für mich. Ich bin immer noch verwirrt, warum dict nicht in NSDictionary umgewandelt werden kann. – ubertao

+0

Der Grund ist der generische Typ, der nicht mit 'NSDictionary' verwandt ist. Wenn Sie den Parameter als '[String: AnyObject]' ohne generischen Typ deklarieren, müssen Sie 'dict' gar nicht umsetzen – vadian

1

Mit NSJSONSerialization können Sie Wörterbücher in NSData konvertieren. Versuchen Sie, diese

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

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

Ich kann 'AnyObject' nicht verwenden, da ein anderer Teil meines Codes die Klasse (die die obige Funktion enthält) mit Typ wie 'Int' instanziiert. – ubertao

+0

In diesem Fall können Sie AnyObject durch Int ersetzen –

Verwandte Themen