在Swift中将[String:AnyObject]分配给[String:AnyObject],用逗号替换逗号

时间:2015-02-08 14:06:37

标签: ios swift

我有

var params = [String:AnyObject]()

我有一个返回[String:AnyObject]的函数。所以,我想将其分配给params这样的键:

params["phoneDetails"] = getPhoneDetails()

我遇到的问题是,getPhoneDetails()的返回值与params["phoneDetails"]中的值不同。

这是getPhoneDetails()

的输出
[locale: en, ostype: 32bit, appversion: 4.0.0, architecture: x86, version: 8.1]

以下是params["phoneDetails"]的输出:

Optional({
    appversion = "4.0.0";
    architecture = "x86 ";
    locale = en;
    ostype = 32bit;
    version = "8.1";
})

因此,当使用println(params["phoneDetails"])时,我看到了一个分号,而不是逗号。

我希望它与getPhoneDetails的返回类型相同。我做错了什么?

1 个答案:

答案 0 :(得分:6)

原因是Swift隐含地将您的Swift.Dictionary转换为NSDictionary

let d: [String:AnyObject] = ["one":"1","two":"2"]
// Swift.Dictionary implements Printable.description 
// (which println uses) as [key:value, key:value]
d.description

let nsd = d as NSDictionary
// NSDictionary on the other hand, implements
// it as {\n    key = value;\n   key = value;\n}
nsd.description

转换的原因是您使用AnyObject。理论上,AnyObject只能存储引用类型(即类)。在游乐场中尝试以下操作,顶部没有任何导入语句,即删除import UIKit或其他:

// this won’t even compile - Strings aren’t classes, they’re structs
// so you can’t assign them to AnyObject
let d: [String:AnyObject] = ["one":"1","two":"2"]

// this fixes that:
let e: [String:String] = ["one":"1","two":"2"]
// but this won’t compile:
let o: AnyObject = e  // [String:String] doesn’t conform to protocol AnyObject

import Foundation突然发生了魔法。实际上有两点魔法:字符串文字现在可以创建NSString个对象,它们是类,因此符合AnyObject。 Swift词典可以静默地转换为NSDictionary个对象,这些对象也是符合AnyObject的类。后一个是你发生的事情,所以你得到一个不同的输出,因为你的类型确实是一个不同的类型。

如果您不希望它们属于不同的类型,您有两种选择 - 从NSDictionary函数(ick)返回getPhoneDetails或停止使用AnyObject而是声明你的字典是[String:[String:String]]类型的(是的,但是导致更强的类型和值而不是引用语义,这可能意味着必须重构其他代码)。

(或者我猜你可以切换到[String:Any],但那里有疯狂)