NSDictionary和Swift中的Dictionary之间有什么区别?

28

我正在学习Swift语言,发现其中有Dictionary数据类型。
但是,有很多例子中使用了Swift中的NSDictionary数据类型。
这两者之间有什么区别呢?
我想在Swift中像PHP中的数组一样使用带索引的数组。
那么,在这种情况下,哪个更好用呢?

4个回答

21

字典是一种本地的Swift结构体。NSDictionary是一个Cocoa类。它们之间可相互桥接(在通常的限制内),正如文档非常清楚和完整地解释的那样。

这与数组和NSArray完全平行。


1
那么 Dictionary 和 NSDictionary 是一样的吗?但我看到有两种声明方式。所以我有点困惑。 - TomSawyer
18
实际上,Dictionary 是一个结构体而非类。 - newacct
5
我还要补充一点,NSDictionary 是一个引用类型,而像 Swift 中的每个结构体一样,Dictionary 是一个值类型。 - agy
那么如何选择? - Alston
1
@Alston 如果你在写Swift代码,使用Swift类型的Dictionary。如果你在写(或与之交流)Objective-C代码,请使用(或转换为)NSDictionary。 - matt
显示剩余2条评论

7
在实践中,就Swift的强类型概念而言,显著的区别在于:
  • NSDictionary 通常没有指定类型。
  • Dictionary 被认为具有特定类型。
因此,本地的Dictionary更可取。

2

这是情况,

就所有意图而言,它们是相同的。只要导入Foundation,编译器将把它们视为相同的东西。

至于具体差异,因此苹果文档有所帮助。

概述

NSObject是大多数Objective-C类层次结构的根类。通过NSObject,对象继承了一个基本接口到运行时系统和作为Objective-C对象的能力。

简而言之,这意味着NSObjects是来自旧时(objective c)的古老遗物。

至于哪个更好,这取决于您。我发现Swift对象比ns对应物更好,仅用于保持代码现代化,但如果您使用像NSURLCONNECTION这样需要ns对象的代码,则可能必须使用ns对象。

希望这可以帮助你。


4
它们确实不同。Swift 字典是值传递,而 NSDictionary 是引用传递。 - Shaun Budhram

1
考虑以下示例。
    let dataArray = NSMutableArray()

    let d0 = ["code":"AA","name":"American Airlines"]
    let d1 = ["code":"BA","name":"British Airlines"]
    let d2 = ["code":"DA","name":"Delta Airlines"]

    dataArray.addObject(d0)
    dataArray.addObject(d1)
    dataArray.addObject(d2)

稍后...
let d0 = dataArray.objectAtIndex(0) as! [String:String]
let lbl = UILabel() 
lbl.text = d0["code"] // no xcode warnings

使用Swift中的NSDictionary。
let d0 = dataArray.objectAtIndex(0) as! NSDictionary 

现在你需要将字典值强制转换为所需格式。
lbl1.text = d0["name"] as! String

从经验来看,当处理json响应时,我使用NSDictionary,因为它是松散类型的,我不能保证确切地知道它包含什么,只知道它是有效的json。有越来越多的本地swift工具库来处理这种情况,建议在此处查看https://github.com/search?q=json+NSDictionary+swift&type=Code&utf8=%E2%9C%93 在这种情况下,你需要用'if let'来绕过数据。
if let results = json["result"] as? NSDictionary

最后 - NSMutableDictionary 更像是 Dictionary,因为你不能在 NSDictionary 上改变键/值对。
例如:
results["code"] = 100 // <-- BOOM

工作区 -
let mResults = NSMutableDictionary(dictionary:results)

mResults["code"] = NSNumber(100) // <-- OK

这需要澄清 - 只能将NSObjects(NSNumbers / NSArrays / NSCount / NSSet)放入NSMutableDictionaries中。Swift字典可以解决此问题。

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