Questa domanda di natura un po ' "discussione", ma Aggiungerò due punti a favore a volte preferendo le tuple sulle strutture.
nativo conformità equatable per le tuple di dimensioni limitate
In Swift 2.2, tuple fino alla taglia 6 sarà nativamente equatable, dato che si tratta di membri sono equatable
Ciò significa che a volte le tuple saranno la scelta naturale sull'uso di costrutti più piccoli in un ambito limitato.
E.g. si consideri il seguente esempio, utilizzando (1)
: una struttura
struct Foo {
var a : Int = 1
var b : Double = 2.0
var c : String = "3"
}
var a = Foo()
var b = Foo()
// a == b // error, Foo not Equatable
/* we can naturally fix this by conforming Foo to Equatable,
but this needs a custom fix and is not as versatile as just
using a tuple instead. For some situations, the latter will
suffice, and is to prefer. */
func == (lhs: Foo, rhs: Foo) -> Bool {
return lhs.a == rhs.a && lhs.b == rhs.b && lhs.c == rhs.c
}
e (2)
: una tupla
/* This will be native in Swift 2.2 */
@warn_unused_result
public func == <A: Equatable, B: Equatable, C: Equatable>(lhs: (A,B,C), rhs: (A,B,C)) -> Bool {
return lhs.0 == rhs.0 && lhs.1 == rhs.1 && lhs.2 == rhs.2
}
/* end of native part ... */
var aa = (1, 2.0, "3")
var bb = (1, 2.0, "3")
aa == bb // true
aa.0 = 2
aa == bb // false
accesso generico a diverse tuple tipo: più versatile per diverse strutture di tipo
Da quanto sopra (confrontare le funzioni ==
) appare anche In questo modo è facile lavorare con le tuple nel contesto dei generici, dato che possiamo accedere alle loro proprietà anonime dei membri usando i suffissi .0
, .1
...; mentre per una struttura, il modo più semplice per simulare questo comportamento diventa rapidamente piuttosto complesso, che richiede strumenti come l'introspezione di runtime e così via, vedere e.g. this.
Direi a me stesso che le tuple sono utili solo per le strutture dati utilizzate solo localmente; che altrimenti è meglio avere tutte le strutture dati correttamente definite e "etichettate" come strutture o classi, invece di farle "fluttuare come tuple anonimi". Ma non sono sicuro di non sbagliare ... – George
Penso che l'aspetto della semplicità sia di cosa si tratta :) Non è necessario definire una struttura, meno codice, veloce. Swift ha molte caratteristiche che servono allo scopo della semplicità. –