Diese Frage einer leicht „Diskussion“ Natur, sondern Ich werde zwei Punkte hinzufügen, die Tupel gegenüber Strukturen bevorzugen.
Einheimische gleichzusetzen Konformität für eine begrenzte Größe Tupeln
In Swift 2.2 von Tupeln bis Größe 6 nativ gleichzusetzen sein, da es Mitglieder sind gleichzusetzen
Dies bedeutet, dass Tupel manchmal die natürliche Wahl sind über die Verwendung kleinerer Konstrukte in einem begrenzten Umfang.
z. betrachten Sie das folgende Beispiel unter Verwendung (1)
: eine Struktur
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
}
und (2)
: ein Tupel
/* 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
generischen Zugriff auf verschiedene Art Tupeln: vielseitiger als für unterschiedliche Art Strukturen
Von den oben genannten (vergleichen Sie die ==
Funktionen) ist es auch appare Es ist einfach, mit Tupeln im Kontext von Generika zu arbeiten, da wir auf ihre anonymen Member-Eigenschaften unter Verwendung der .0
, .1
... Suffixe zugreifen können; während für eine Struktur der einfachste Weg, dieses Verhalten nachzuahmen, schnell sehr komplex wird und Werkzeuge wie Laufzeit-Introspektion usw. benötigt, siehe e.g. this.
Ich würde sagen, dass Tupel nur für Datenstrukturen nützlich sind, die nur lokal verwendet werden; ansonsten ist es besser, alle Datenstrukturen als Strukturen oder Klassen richtig definiert und "etikettiert" zu haben, anstatt sie "als anonyme Tupel herumfließen zu lassen". Aber ich bin mir nicht sicher, ob ich nicht falsch liegen würde ... – George
Ich denke, der Einfachheit Aspekt ist, worum es geht :) Keine Notwendigkeit, eine Struktur, weniger Code, schnell zu definieren. Swift hat viele Funktionen, die der Einfachheit dienen. –