2015-02-08 59 views
5

逗号我有分配一个[字符串: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相同。我究竟做错了什么?

+0

输出格式化的println遵循自己的规则。如果你想要一个不同的格式,你需要手动完成。 – 2015-02-08 14:12:33

+0

我的猜测是,getPhoneDetails()返回一个元组而不是一个字典。 getPhoneDetails()从哪里来? – Alex 2015-02-08 14:21:55

+0

我写了。它返回一个[String:AnyObject]。 – Rishi 2015-02-08 14:44:54

回答

6

这样做的原因是,斯威夫特被隐式转换您Swift.DictionaryNSDictionary

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]但其实存在着疯狂)

相关问题