我有
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
的返回类型相同。我做错了什么?
答案 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]
,但那里有疯狂)