Swift中的元组与对象

时间:2019-03-02 06:57:23

标签: swift object tuples

我已经阅读了有关元组和字典/数组的区别,但是我还没有碰到Stack Overflow上的一篇文章,解释了元组和Swift中对象之间的区别。

我问的原因是,根据经验,在很多情况下(特别是在对象仅保存其他对象或数据的情况下),似乎元组在Swift中可以与对象互换。但是,这可能导致不一致/混乱代码。

在Swift中,是否有时间基于性能或编码方法使用元组和基本对象?

2 个答案:

答案 0 :(得分:2)

正如vadian所说,Apple的建议是元组仅用于临时值。这发挥出来。如果您需要对数据结构进行几乎所有不平凡的事情,包括将其存储在属性中,则可能不希望使用元组。他们非常有限。

在此讨论中,我将避免使用术语“对象”。这是一个模糊的描述性术语,无法清晰地映射到任何特定的数据结构。认为元组的正确方法是与结构相反。原则上,元组只是一个匿名结构,但是在Swift中,元组的灵活性大大低于结构。最重要的是,您不能向元组添加扩展,而添加扩展是Swift编程的核心部分。

基本上,大约在您认为需要标记元组的字段时,您可能应该改用struct。像“点”这样简单的类型都将按结构而不是元组建模。

那么您何时会使用元组?考虑Collection上的以下(不存在)方法:

extension Collection {
    func headTail() -> (Element?, SubSequence) {
        return (first, dropFirst())
    }
}

这是元组的好用法。仅仅为了返回该值而发明一个特殊的结构将是无益的,而调用者几乎总是想对它进行破坏,例如:

let (head, tail) = list.headTail()

这是元组可以做的事情,而结构不能做到(至少在今天;正在讨论将结构解构和模式匹配添加到Swift)。

答案 1 :(得分:1)

在Swift中,元组是一种复合类型,将一些属性结合在一起,这些属性是由Swift命名类型的对象(例如类,struct和enum)构建的。

我将这些命名类型的对象比作化学元素的矿物质(如碳,钙),而元组只是这些矿物质的一种物理混合物(例如,一包钙矿石和三份碳矿石的包) )。您可以轻松携带这个打包的元组,并将其添加到“加热或按压”方法中,以返回您的应用在建筑中使用的“石灰石”。