元组与字典的区别

有人能解释什么是元组和字典之间的主要区别是什么时候使用哪些在Swift?

主要区别:

  • 如果你需要从一个方法返回多个值,你可以使用元组。
  • 元组不需要像Dictionary这样的任何键值对。
  • 一个元组只能包含预定义数量的值,在字典中不存在这样的限制。
  • 元组可以包含具有不同数据types的不同值,字典一次只能包含数据types值
  • 元组对于从函数返回多个值特别有用。 字典可以用作模型对象。

有两种types的元组:

1命名Tuple

在命名元组中,我们为每个元素分配单独的名称。

将其定义为:

let nameAndAge = (name:"Midhun", age:7) 

访问像这样的值:

 nameAndAge.name nameAndAge.age 

2未命名的元组

在未命名的元组中,我们不指定元素的名称。

将其定义为:

 let nameAndAge = ("Midhun", 7) 

访问像这样的值:

 nameAndAge.0 nameAndAge.1 

要么

 let (theName, thAge) = nameAndAge theName thAge 

参考:

元组

元组使您能够创build和传递值的分组。 您可以使用元组作为单个复合值从函数中返回多个值。

你可以用Swift编程语言来查看更多关于Tuple的信息

字典

字典是存储相同types的多个值的容器。 每个值都与一个唯一的键相关联,该键作为字典中该值的标识符

您可以检查更多关于在斯威夫特CollectionTypes字典

  • 一个元组是完全预定义的:它只能拥有为其预定义的值的名称和数量,尽pipe它们可以是不同的值types,并且不必具有名称。 名字是文字。

  • 一个字典可以有任何数量的键值对, 一个值types。 键可以通过variables来引用。


这是一个元组(名称):

 typealias MySillyTuple = (theInt:Int, theString:String) 

而已。 有一个Int称为“Int”,一个“String”称为“string”,这正是它所必须具备的,不多也不less。 而通过名称访问这些值的唯一方法是作为一个文字: t.theInt 。 如果你有一个string"theInt" ,你不能用它来访问t.theInt

这是一个词典:

 var d = [String:String]() 

现在d可以有任意数量的键和任何键,从无到万兆。 而且可以使用stringvariables来指定键。 你不必事先知道一个关键是什么。 所有的值都必须是string。

所以基本上我会说一个元组不是一个字典。 字典是一个复杂的动物用于查找dynamic键。 元组只是一个值不止一个值。

字典由键值集合组成。 元组是为传递分组值而制作的。

字典:

字典是存储相同types的多个值的容器。 每个值都与一个唯一的键相关联,该键作为字典中该值的标识符。

应该使用字典来创build关联对象的列表。 一个例子就是一个玩家字典和他们的分数:

 var scoreDictionary = ["Alice" : 100, "Bob" : 700] 

元组

元组将多个值组合为一个复合值。

应该使用一个元组来传递值组。 它们与数组类似 ,但是是固定长度和不可变的。 一个示例用法可能是一个代表三维点的元组:

 var myPoint = (10, 12, 14) 

正如你所看到的,在很多情况下,你会使用一个字典和许多情况下,你会使用一个元组。 每个人都有其特定的目的。

  1. DictionaryCollection TypeTupleCompound type
  2. DictionaryKey Valuetypes, TupleComma separated list of multiple types

字典:

var dictionary = ["keyone": "value one", "keytwo": "Value Two"]

元组:

 let someTuple: (Double, Double, String, (Int, Int)) = (3.14159, 2.71828, "Hello", (2, 3)) 

元组是复合值,可用于从函数返回多个值的函数。 例如(来自Apple Docs):

 func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) { var min = scores[0] var max = scores[0] var sum = 0 for score in scores { if score > max { max = score } else if score < min { min = score } sum += score } return (min, max, sum) } 

这个函数返回一个包含min,max和sum的元组。 这些值可以通过名称或位置进行访问:

 let statistics = calculateStatistics([5, 3, 100, 3, 9]) var sum:Int = statistics.sum var sum2:Int = statistics.2 

字典是“查找”数据types。 他们返回一个给定的键的对象。 例如下面的代码:

 let font:NSFont = NSFont(name: "AppleCasual", size: 18.0)! let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as NSMutableParagraphStyle textStyle.alignment = NSTextAlignment.LeftTextAlignment let textColor:NSColor = NSColor(calibratedRed: 1.0, green: 0.0, blue: 1.0, alpha: 1.0) let attribs = [NSFontAttributeName: font, NSForegroundColorAttributeName: textColor, NSParagraphStyleAttributeName: textStyle] let color = attribs[NSForegroundColorAttributeName] println("color = \(color)") 

将打印:

color =可选(NSCalibratedRGBColorSpace 1 0 1 1)

字典对于许多事情是有用的,并且对于某些function是必需的。 例如(在上面的代码之后):

 let testString:NSString = "test String" var img:NSImage = NSImage(size: NSMakeSize(200,200)) img.lockFocus() testString.drawAtPoint(NSMakePoint(0.0, 0.0), withAttributes: attribs) img.unlockFocus() 

在这个代码中,drawAtPoint使用字典attrib来查找它所需要的参数。 参数不需要以任何特定的顺序,因为drawAtPoint将使用正确的键来查找所需的值。

字典和元组是相似的,但不完全相同。 在上面的代码中,字典返回一个可选types:Optional(NSCalibratedRGBColorSpace 1 0 1 1)

如果我们为了相同的目的使用一个元组:

 var attribTuple = (font:NSFont(name: "AppleCasual", size: 18.0), color:NSColor(calibratedRed: 1.0, green: 0.0, blue: 1.0, alpha: 1.0)) println("tupleColor = \(attribTuple.color)") 

打印:

tupleColor = NSCalibratedRGBColorSpace 1 0 1 1

不是字典所做的可选types。

元组是固定长度的东西。 你不能添加一个额外的元素到一个元组或删除一个。 一旦你创build了一个元组,它具有相同数量的元素 – var t = (1,2)是types(Int,Int) 。 它永远不会成为(1,2,3) ,你能做的最多的就是改变它(7,8) 。 这一切都是在编译时固定的。

您可以像这样通过数字位置访问元素

 t.0 + t.1 // with (1,2), would equal 3 t.0 = 7 

数组的长度是可变的:你可以从一个数组var a = [1,2] ,然后通过a.append(3)添加一个条目使其成为[1,2,3] 。 你可以用a.count来告诉多less物品。 您可以通过下标访问/更新元素: a[0] + a[2] // equals 4

你可以用元组命名元素:

 var n = (foo: 1, bar: 2) 

那么你可以使用这些名字:

 n.foo + n.bar // equals 3 

这并不能消除按位置访问它们的能力:

 n.0 + n.1 // equals 3 

但是,这些名字一旦设定,就会在编译时固定,就像长度一样:

 n.blarg // will fail to compile 

这与字典(像数组)可以增长或缩小的情况不一样:

 var d = [“foo”:1, “bar”:2] d[“baz”] = 3; d[“blarg”] // returns nil at runtime, there's no such element