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

5

I have

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 的返回类型相同。我做错了什么吗?


println的输出格式遵循其自己的规则。如果您想要不同的格式,则需要手动进行更改。 - qwerty_so
我的猜测是getPhoneDetails()返回的是一个元组而不是字典。getPhoneDetails()是从哪里来的? - Alex
我写了它。它返回一个[String:AnyObject]。 - Rishi
我玩了一下,但现在我发现我的printlns从不使用{},也没有分号。非常奇怪。你能发布一个playground摘录吗? - qwerty_so
@AirspeedVelocity 那个建议仅用于调试目的(我不确定这个 Optional 是否会影响内部变量的打印方式),但你在回答中的观点更准确 :) - Romain
显示剩余3条评论
1个回答

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 只能存储引用类型(即类)。在 playground 中尝试以下操作不要在顶部添加任何导入语句,即删除 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

但是一旦导入Foundation,神奇的事情就发生了。实际上有两个神奇的地方:字符串字面量现在可以创建NSString对象,它们是类,因此符合AnyObject标准。Swift字典可以自动转换为NSDictionary对象,并且这些也是类,因此符合AnyObject标准。后者就是正在发生的事情,所以您会得到不同的输出,因为您的类型确实是不同的类型。
如果您不希望它们成为不同的类型,则有两个选择-从getPhoneDetails函数返回NSDictionary(不好)或停止使用AnyObject,而是将字典声明为[String:[String:String]]类型(好,但会导致更强的类型和值而不是引用语义,这可能意味着必须重构其他代码)。
(或者我想您可以切换到[String:Any],但那里存在疯狂的风险)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接