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

时间:2016-01-18 05:14:53

标签: swift collections tuples

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

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

1 个答案:

答案 0 :(得分:6)

我没有内心的动机知识,但我希望能有更深刻的理解。

类型安全

Swift的主要目标之一是强制执行编程最佳实践,以最大限度地减少人为错误。这些最佳实践之一是确保在我们了解它们时始终使用特定类型。在Swift中,变量和常量总是有明确的类型,如果你知道它将存储String,那么集合更喜欢保持AnyObject s而不是String s。

值得注意的是,Swift中的每个集合类型只能包含一种元素。其中包括ArrayDictionarySet

元组是复合类型

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

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

有关详细信息,请参阅The Swift Programming Language的“类型”一章。

元组表示对象

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

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

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

此外,每个Tuple类型都有自己的显式类型。例如,(Int, Int)(Int, Int, Int)完全不同,(Double, Double, Double)与[{1}}完全不同。

有关详细信息,请参阅" Tuples"在The Swift Programming Language的基础知识章节中。

元组用于基本语言语法

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

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

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

for (_, letter) in dict {

    doSomething()

}

这里我们使用一个元组来迭代字典的值并忽略键。

我们可以在Switch语句中执行相同的操作(摘自The Swift Programming Language):

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”

因为元组在语言语法的基础上被使用,所以将它们与集合类型捆绑在一起是不合适的。

SequenceType& CollectionType

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

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

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