分配一个[字符串:AnyObject]至[字符串:AnyObject]在夫特替换分号
逗号我有分配一个[字符串:AnyObject]至[字符串:AnyObject]在夫特替换分号
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
相同。我究竟做错了什么?
这样做的原因是,斯威夫特被隐式转换您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语句在顶部即删除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
对象,这些对象是类,因此符合01。斯威夫特字典可以悄悄地转换为NSDictionary
对象,这些对象也是符合AnyObject
的类。后者是发生在你身上的事情,所以你会得到不同的结果,因为你的类型确实是不同的类型。
如果你不希望他们是不同类型的,你有两个选择 - 从getPhoneDetails
功能(益)返回一个NSDictionary
或停止使用AnyObject
,而是宣告你的字典是[String:[String:String]]
类型(耶,但导致更强的类型和价值而不是引用语义,这可能意味着不得不重构其他代码)。
(或我想你可以切换到[String:Any]
但其实存在着疯狂)
输出格式化的println遵循自己的规则。如果你想要一个不同的格式,你需要手动完成。 – 2015-02-08 14:12:33
我的猜测是,getPhoneDetails()返回一个元组而不是一个字典。 getPhoneDetails()从哪里来? – Alex 2015-02-08 14:21:55
我写了。它返回一个[String:AnyObject]。 – Rishi 2015-02-08 14:44:54