元组与字典差异

时间:2014-12-24 03:37:47

标签: ios swift

有人可以解释一下元组和词典之间存在的主要区别是什么以及何时在Swift中使用哪些?

6 个答案:

答案 0 :(得分:45)

主要区别:

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

有两种类型的元组:

1名为元组

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

将其定义为:

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

参考:

元组

  

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

您可以在Swift Programming Language

中查看有关元组的更多信息

词典

  

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

您可以在Swift CollectionTypes

中查看有关词典的更多信息

答案 1 :(得分:6)

  • 元组是完全预定义的:它只能包含您为其预定义的值的名称和数量,尽管它们可以是不同的值类型,并且它们不会&# 39;必须有名字。名字是文字。

  • 字典可以包含任意数量的一个值类型的键值对。密钥可以通过变量引用。


这里是一个元组(带名字):

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

那就是它。有一个名为theInt的Int,一个名为theString的字符串,这正是它必须拥有的,不多也不少。并且按名称访问值的唯一方法是文字:t.theInt。如果您有字符串"theInt",则无法使用该字符串访问t.theInt

这是一个词典:

var d = [String:String]()

现在d可以有任意数量的密钥,任何密钥,从无到有。并且可以使用字符串变量指定键;你不必事先知道一把钥匙是什么。并且所有值都必须是字符串。

所以基本上我会说元组不像字典。字典是用于通过动态键查找的复杂野兽。元组只是一个多于一个值的值。

答案 2 :(得分:2)

字典由键值集组成。元组用于传递分组值。

<强>字典:

  

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

应该使用字典来创建关联对象的列表。一个示例用法是玩家及其分数的字典:

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

<强>元组

  

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

应该使用元组来传递值组。它们是similar to arrays,但是固定长度且不可变。示例用法可能是表示三维点的元组:

var myPoint = (10, 12, 14)

正如您所看到的,在很多情况下您会使用字典以及许多使用元组的情况。每个都有自己的特定目的。

答案 3 :(得分:1)

  1. DictionaryCollection TypeTupleCompound type
  2. DictionaryKey Value类型,TupleComma separated list of multiple types
  3. 字典:

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

    元组:

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

答案 4 :(得分:1)

元组是复合值,对于从函数返回多个值的函数非常有用。例如(来自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

词典是“查找”数据类型。它们返回给定键的对象。例如,以下代码:

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)

字典对很多东西很有用,并且是某些功能所必需的。例如(在上面的代码之后):

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使用字典attribs来查找所需的参数。参数不需要按任何特定顺序排列,因为drawAtPoint将使用正确的密钥查找所需的值。

字典和元组相似,但不完全相同。在上面的代码中,字典返回了一个Optional类型: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

不是字典的可选类型。

答案 5 :(得分:0)

元组是固定长度的东西。您无法向元组添加额外元素或删除元素。创建元组后,它具有相同数量的元素 - var t = (1,2)的类型为(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来判断项目数量。您可以通过下标来访问/更新元素: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