【发布时间】:2023-03-08 17:49:02
【问题描述】:
有人可以解释一下元组和字典之间的主要区别是什么以及何时在 Swift 中使用哪个?
【问题讨论】:
有人可以解释一下元组和字典之间的主要区别是什么以及何时在 Swift 中使用哪个?
【问题讨论】:
在命名元组中,我们为每个元素分配单独的名称。
定义如下:
let nameAndAge = (name:"Midhun", age:7)
访问以下值:
nameAndAge.name
nameAndAge.age
在未命名的元组中,我们不为其元素指定名称。
定义如下:
let nameAndAge = ("Midhun", 7)
访问以下值:
nameAndAge.0
nameAndAge.1
或
let (theName, thAge) = nameAndAge
theName
thAge
元组使您能够创建和传递值分组。你 可以使用元组从函数中返回多个值作为单个值 复合值。
您可以在Swift Programming Language 中查看有关 Tuple 的更多信息
字典是存储多个相同值的容器 类型。每个值都与一个唯一键相关联,该键充当 字典中该值的标识符
您可以在Swift CollectionTypes查看更多关于字典的信息
【讨论】:
元组是完全预定义的:它只能具有您为其预定义的值的名称和数量,尽管它们可以是不同的值类型,并且它们没有有名字。并且名称是文字。
字典可以有任意数量的键值对,one 值类型。并且可以通过变量来引用键。
这是一个元组(带有名称):
typealias MySillyTuple = (theInt:Int, theString:String)
就是这样。有一个称为theInt 的Int,一个称为theString 的String,这正是它必须具有的,不多也不少。通过名称访问值的唯一方法是使用文字:t.theInt。如果你有一个字符串"theInt",你不能用它来访问t.theInt。
这是一本字典:
var d = [String:String]()
现在d 可以有任意数量的键,any 键,从无到无数。并且可以使用字符串变量指定键;您不必事先知道密钥是什么。并且所有的值都必须是字符串。
所以基本上我会说元组与字典完全不同。字典是通过动态键查找的复杂野兽。元组只是一个多于一个值的值。
【讨论】:
myData: (sectionTitle: String, rowTitles: [String]) 或 myData: [String: [String]] - 为什么?我更喜欢元组,但这是一个例子,我可以看到为什么会问这个问题。
tuple 来存储数据,这不是它的用途。通常tableView 的数据源是对象的Array,例如struct、class,甚至是Dictionary
Dictionary 是 Collection Type,Tuple 是 Compound type。Dictionary 是 Key Value 类型,Tuple 是 Comma 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))
【讨论】:
字典由键值集组成。一个元组用于传递分组值。
字典:
字典是存储多个相同值的容器 类型。每个值都与一个唯一键相关联,该键充当 字典中该值的标识符。
应该使用字典来创建关联对象的列表。一个例子是玩家及其分数的字典:
var scoreDictionary = ["Alice" : 100, "Bob" : 700]
元组:
元组将多个值组合成一个复合值。
应该使用元组来传递值组。它们是similar to arrays,但是是固定长度和不可变的。一个示例使用可能是表示 3 维点的元组:
var myPoint = (10, 12, 14)
如您所见,在很多情况下您会使用字典,在很多情况下您会使用元组。每个都有其特定的目的。
【讨论】:
元组是复合值,对于从函数返回多个值的函数很有用。例如(来自 Apple 文档):
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)")
将打印:
颜色 = 可选(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 使用字典属性来查找它需要的参数。参数不需要按任何特定顺序排列,因为 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
不是字典的可选类型。
【讨论】:
元组是固定长度的东西。您不能向元组添加额外元素或删除一个元素。一旦你创建了一个元组,它就有相同数量的元素——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
【讨论】: