Swift 或一般 OOP 中元组的一些典型用例是什么?

What are some typical use-cases for Tuples in Swift or OOP in general?

我大约 4 个月前在 Swift 开始了一个新的 iOS 项目,只是为了学习这门语言。在我开发它的过程中,我发现自己几乎从不在整个程序中使用元组。这是因为我真的习惯了没有元组的Java和Objective-C。

我听说过一些关于元组的很棒的事情,Apple 似乎对将它们添加到 Swift 中感到非常兴奋,但我似乎很难为它们找到一个真正有用的案例。

到目前为止,我理解并将它们用于一件事:quick-class 替换器。不要仅仅为了将几个属性保持在一起而创建一个新的 class ,而是使用一个元组。但即便如此,我也只为此使用了一次元组,因为很多时候这些属性会相互影响,所以那些改变这些属性的方法最好包含在具有这些属性的 class 中。那么这真的是优势吗?

但是元组新手应该知道哪些其他真正有用的 OOP(或 Swift)设计模式?

谢谢!

标准库中的几个示例可能会有所帮助。

一个常见的需求是 return 不仅仅是一个函数的一个值,而是两个不同的值。因此,例如,在 _IntegerArithmeticType 协议中,有:

static func addWithOverflow(lhs: Self, _ rhs: Self) -> (Self, overflow: Bool)

也就是说,它 return 是新值,加上是否存在溢出的布尔指示符:

let i: UInt8 = 0xFF
let (j, overflow) = UInt8.addWithOverflow(i, 1)
if overflow { println("Oh noes!") }

如果没有元组,您将不得不求助于 inout 作为结果之一,或者 return 另一个结构。

Dictionary 集合的元素有两种类型,一个键和一个值。这些通常捆绑在一起,所以 Dictionary 定义了一个类型,Element 作为两者的元组:

struct Dictionary<Key : Hashable, Value> : CollectionType, DictionaryLiteralConvertible {
    typealias Element = (Key, Value)
}

然后,当你遍历字典时,你得到的每个元素都是这对,内置的元组解构允许你方便地将它们分成两部分:

// either treat them as a pair:
for element in myDictionary { }

// or destructure them:
for (k, v) in myDictionary { }

现在,理论上,这两个示例都可以通过定义新结构来完成。因此,例如溢出情况:

struct ResultWithOverflow<T: _IntegerArithmeticType> {
    let value: T
    let overflow: Bool
}

static func addWithOverflow(lhs: Self, _ rhs: Self) -> ResultWithOverflow<Self>

然而,重要的是要理解,在这里,元组不仅仅被使用,因为必须定义这个额外的结构是一件痛苦的事情(尽管这是真的)。更多的是因为这个额外的结构很混乱——它妨碍了函数的阅读。如果你想知道 addWithOverflow 做了什么,你必须去查找 ResultWithOverflow 是什么。相反,对于元组,在函数定义中很清楚 returned.

同样,如果字典中有一个 DictionaryElement 结构作为其元素,那也将是一个额外的复杂问题,可能会妨碍理解字典的工作原理。

显然,这是一种权衡,如果你在任何地方都使用元组而不是定义适当的结构,你就会走得太远,使你的代码难以阅读。但在使用一次性且轻量级的情况下,它们更易于编写和阅读。

@Airspeed Velocity 给出了非常好的答案!我只是想添加元组在与 switch 语句一起使用时的用处。例如:

let point = (x: 10, y: 5)

switch point {
    case (10, 5):
        println("Point at (10, 5)")

    case (-10...10, 5):
        println("Point where y = 5 and x lies in the range [-10, 10]")

    case (_, 5) :
        println("Point with y = 5")

    case (let x, _) where x % 2 == 0:
        println("Point with x that is a multiple of 2 (x = \(x))")

    default:
        println("A Point")
}

显然,这不是您真正使用的示例,但我认为它展示了元组的一些功能。

A​​pple 的 Swift 编程语言 讨论了更多关于元组的内容,如果您还没有看过,请看这里 link:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID309