Fork me on GitHub

Swift 元组(Tuples)

创建元组

在 Swift 中创建元组的方式很简单,语法类似数组,但需要把方括号替换为圆括号:

0x00

1
let firstHighScore = ("Mary", 9001)
  • 与数组不同的是,元组中的元素可以是任意类型。上面代码中 firstHighScore 元组就包含一个 String 类型的元素和一个 Int 类型的元素。

0x01

  • 另外,在创建元组时你还可以给元组中的元素命名:
1
let secondHighScore = (name: "James", score: 4096)

这样可以让我们在使用元组的时候明确的指定某个元素,非常有用。在后面的文章中大家可以看到给元素命名的好处。

以上就是创建元组的两种方式,非常简单和简洁。你不需要像创建 struct 一样写出它的结构和内部属性,也不需要像创建 class 一样要写初始化方法。你只需要把你想用的、任何类型的值放在圆括号内,用逗号隔开即可。如果你愿意你还可以给每个元素命名,提高元组使用效率。

从元组中读元素

从元组中读取元素有几种方式,但一般我们会选择最适合当前应用场景的方式,并且确保选择的方式是在当前情况下最简单的一种。

0x00

如果我们没有给元组的元素命名,我们可以用点语法,通过定义好的元组变量或常量获取它的第 1 个到第 n 个元素:

1
2
3
let firstHighScore = ("Mary", 9001)
firstHighScore.0 // Mary
firstHighScore.1 // 9001

0x01

如果你觉得上述这种方法会造成语义的不明确,那么我们还可以将元组赋值给一个带有元素名称的元组(元素名称个数要对应):

1
2
3
let (firstName, firstScore) = firstHighScore
firstName // Mary
firstScore // 9001

0x02

如果你只想读取 firstHighScore 元组中的分数,那么你可以这样写:

1
2
let (_, firstScore) = firstHighScore
firstScore // 9001

0x03

元组元素有命名
如果我们已经给元组中的元素命名了名称,那么我们可以这样写:

1
2
3
4
let secondName = secondHighScore.name
let secondScore = secondHighScore.score
secondName // James
secondScore // 4096

0x04

将元组作为函数返回值
我们可以将元组作为函数的返回值,下面这个函数的返回值就是我们之前定义过的 secondHighScore 元组:

1
2
3
4
5
6
func getAHighScore() -> (name: String, score: Int)
{
let theName = "Patricia"
let theScore = 3894
return (theName, theScore)
}

为什么说上述函数的返回值是 secondHighScore 元组呢?因为 getAHighScore 函数返回的元组元素个数、元素名称、元素类型均和 secondHighScore 相同。

其实将元组作为函数的返回值时也可以不必对元素进行命名,只要你明白每个元素代表的含义即可:

1
2
3
4
5
6
func getAHighScore() -> (String, Int)
{
let theName = "Patricia"
let theScore = 3894
return (theName, theScore)
}
  • 如果你不确定返回的元组一定不为 nil ,那么你可以返回一个可选的元组类型:
1
2
3
4
func maybeGetHighScore() -> (String, Int)?
{
return nil
}
  • 因为是可选的元组类型,所以当返回的元组不为 nil 时,你需要对元组进行解包:
1
2
3
4
5
6
7
8
9
if let possibleScore = maybeGetHighScore()
{
possibleScore.0
possibleScore.1
}
else
{
println("Nothing Here")
}
  • 注意:当你定义了一个没有返回值的函数时,其实该函数是返回一个空的元组 ()。

元组的访问级别
元组的访问级别取决于它包含的元素。比如元组里的元素都是 private 级别的,那么该元组也是 private 级别的。但这里有一个遵循最小的原则,也就是说如果一个元组中有两个元素,一个为private级别,另一个为 public 级别,那么该元组遵循最小原则,它的访问级别为 private 。

元组是值类型
关于值类型和引用类型的知识这里不再累赘,我们通过一个代码示例来看看元组是哪种类型:

1
2
3
4
5
6
var someScore = ("John", 55)
var anotherScore = someScore
anotherScore.0 = "Robert"

println(anotherScore.0) //Outputs: "Robert"
println(someScore.0) //Outputs: "John"

通过上述的代码示例可以看出,我把 someScore 元组赋值给了 anotherScore ,然后修改了 anotherScore 的第1个元素的值,最后分别打印了 someScore 和 anotherScore 第 1 个元素的值。 someScore 元组第一个元素的值为 Robert ,而 anotherScore 元组第一个元素的值仍然为 John 。由此可见元组是值类型。

声明

- END -
关注微信公众号,发现更多精彩

文章作者:梁大红

特别声明:若无特殊声明均为原创,转载请注明,侵权请联系

版权声明:署名-非商业性使用-禁止演绎 4.0 国际