为什么不将Swift元组视为集合类型?

Bry*_*yan -2 collections tuples swift

在Swift中,为什么元组不被视为集合类型?

当然这是一个困扰领域,但我发现一定程度的烦恼有助于我理解,保留和组织我正在学习的东西.

Mat*_*man 6

我对动机没有内部知识,但我希望能够提供更深刻的理解.

类型安全

Swift的主要目标之一是实施编程最佳实践,以最大限度地减少人为错误.这些最佳实践之一是确保在我们了解它们时始终使用特定类型.在Swift中,变量和常量总是具有显式类型,并且如果您知道它将存储s ,则集合更喜欢保持,比如Strings,而不是s.AnyObjectString

值得注意的是,Swift中的每个集合类型只能包含一种类型的元素.这包括Array,Dictionary,和Set.

元组是复合类型

在Swift中,有两种类型:命名类型和复合类型.大多数类型,包括集合类型,都被命名.另一方面,复合类型包含唯一组合中的多个命名类型.只有两种复合类型:函数类型和元组类型.元组类型与集合的不同之处在于:

  • 多个命名类型可以在一个元组类型中捆绑在一起而不使用AnyObject.
  • 每个职位都可以给出一个文字标签.
  • 我们总是可以预测元组将持有多少个值,因为我们声明了每个位置.

有关更多信息,请参阅Swift编程语言的类型一章.

元组代表对象

我们通常不会将集合类型视为对象本身.相反,我们将其视为对象的集合.元组标记的位置和多类型功能使其更像一个对象而不是任何集合.(几乎像一个原始的Struct)

例如,您可能会将HTTP错误视为具有错误代码(Int)和描述(String)的元组.

元组通常用作临时对象的原始方法,例如从函数返回多个值.它们可以快速解剖而无需索引.

此外,每个Tuple类型都有自己的显式类型.例如,(Int, Int)是一种完全不同的类型(Int, Int, Int),它是完全不同的类型(Double, Double, Double).

有关这方面的更多信息,请参阅Swift编程语言的基础知识章节中 "元组" .

元组用于基本语言语法

当我们考虑集合类型时,我们再考虑集合.然而,元组在语言的基本位置使用,使复合类型成为更合适的标题.例如,函数类型是复合Tye,可在您指定函数或闭包时随时使用.它只是一个参数元组和一个返回值元组.甚至Void只是()的一个类型,一个空元组.

此外,元组采用语言语法来临时绑定值.例如,在for-in循环中,您可以使用元组迭代字典:

let dict = [1: "A", 2: "B", 3: "C"]

for (_, letter) in dict {

    doSomething()

}
Run Code Online (Sandbox Code Playgroud)

这里我们使用元组迭代字典的值并忽略键.

我们可以在Switch语句中做同样的事情(摘自Swift编程语言):

let somePoint = (1, 1)
switch somePoint {
case (0, 0):
    print("(0, 0) is at the origin")
case (_, 0):
    print("(\(somePoint.0), 0) is on the x-axis")
case (0, _):
    print("(0, \(somePoint.1)) is on the y-axis")
case (-2...2, -2...2):
    print("(\(somePoint.0), \(somePoint.1)) is inside the box")
default:
    print("(\(somePoint.0), \(somePoint.1)) is outside of the box")
}
// prints "(1, 1) is inside the box”
Run Code Online (Sandbox Code Playgroud)

因为元组在语言语法的基本位置使用,所以将它们与集合类型捆绑在一起感觉不对.

SequenceType & CollectionType

最后要注意的是CollectionType,从中继承了大部分内容的基本特性SequenceType是能够为迭代提供安全的生成器.例如,for-in循环是可能的,因为集合定义了获取下一个项目的方法.因为元组不是由相同类型组成,并且具有保证数量的项目(在声明之后),所以在for-in循环(而不是传统集合)的右侧使用它们将不是直观的.

如果在for-in循环中使用它,那么设计用于集合的东西,对于元组来说似乎不太直观,而元组可能值得一个不同的类别.

有关详细信息CollectionType,请查看SwiftDoc.org.请注意,需要提供迭代的Generator.迭代一个元组不会是类型安全的并且会带来许多不必要的复杂性,但是将元组作为一个集合是一个有趣的概念.这可能是太基础了.