Struktur ist viel schneller als Klasse. Außerdem, wenn Sie Vererbung benötigen, dann müssen Sie Klasse verwenden. Der wichtigste Punkt ist, dass Klasse ein Referenztyp ist, während Struktur ein Werttyp ist. zum Beispiel,
class Flight {
var id: Int?
var description: String?
var destination: String?
var airlines: String?
init() {
id = 100
description = "erster Flug von Virgin Airlines"
destination = "London"
airlines = "Virgin Airlines"
}
}
struct Flight2 {
var id: Int
var description: String
var destination: String
var airlines: String
}
Jetzt erstellen wir Instanzen von beiden.
var flightA = Flight()
var flightB = Flight2.init(id: 100, description: "erster Flug von Virgin Airlines", destination: "London", airlines: "Virgin Airlines")
Jetzt übergeben wir diese Instanzen an zwei Funktionen, die die id, die Beschreibung, das Ziel usw. ändern.
func modifyFlight(flight: Flight) -> Void {
flight.id = 200
flight.description = "zweiter Flug von Virgin Airlines"
flight.destination = "New York"
flight.airlines = "Virgin Airlines"
}
auch,
func modifyFlight2(flight2: Flight2) -> Void {
var passedFlight = flight2
passedFlight.id = 200
passedFlight.description = "zweiter Flug von Virgin Airlines"
}
also,
modifyFlight(flight: flightA)
modifyFlight2(flight2: flightB)
Jetzt, wenn wir die id und Beschreibung von FlightA ausdrucken, erhalten wir
id = 200
description = "zweiter Flug von Virgin Airlines"
Hier können wir sehen, dass die id und Beschreibung von FlightA geändert sind, weil der an die Änderungsmethode übergebene Parameter tatsächlich auf die Speicheradresse des FlugA-Objekts (Referenztyp) zeigt.
Jetzt, wenn wir die id und Beschreibung der Instanz FLightB ausdrucken, erhalten wir
id = 100
description = "erster Flug von Virgin Airlines"
Hier können wir sehen, dass die Instanz FlightB nicht geändert wurde, weil in der modifyFlight2-Methode tatsächlich die Instanz von Flight2 übergeben wird, anstatt die Referenz (Werttyp).
13 Stimmen
Strukturen werden immer kopiert, wenn sie in Ihrem Code weitergereicht werden und verwenden kein Referenzzählen. Quelle: developer.apple.com/library/prerelease/ios/documentation/swift/…
4 Stimmen
Ich würde sagen, dass structs besser geeignet sind, um Daten zu speichern, nicht Logik. Um es in Java-Begriffen auszudrücken, stelle dir structs als "Value Objects" vor.
6 Stimmen
Ich bin erstaunt, dass im gesamten Gespräch nicht direkt auf copy-on-write oder lazy copy verwiesen wird. Eventuelle Bedenken in Bezug auf die Leistung beim Strukturkopieren sind aufgrund dieses Designs größtenteils obsolet.
5 Stimmen
Die Wahl einer Struktur über eine Klasse ist keine Frage der Meinung. Es gibt spezifische Gründe, eine davon zu wählen.
1 Stimmen
Ich empfehle dringend, Warum Array nicht threadSafe ist anzusehen. Dies ist relevant, da Arrays & Strukturen beide Werttypen sind. Alle Antworten hier erwähnen, dass mit Strukturen/Arrays/Werttypen niemals ein Thread-Sicherheitsproblem auftreten wird, aber es gibt einen Sonderfall, in dem dies der Fall ist.
0 Stimmen
Apple hat jetzt (ab 2019) einen Artikel, der diese Frage direkt anspricht Auswahl zwischen Strukturen und Klassen.
0 Stimmen
@DavidJames Die Programmiersprache Swift: Strukturen und Klassen: Strukturen und Aufzählungen sind Wertearten sagt: "Sammlungen, die von der Standardbibliothek definiert sind, wie Arrays, Dictionaries und Strings" (nicht alle Strukturen) verwenden die Copy-on-Write-Technik. Siehe Kopiert Swift bei allen Strukturen?
0 Stimmen
Abgesehen von Swift komme ich langsam zu dem Schluss, dass die Verwendung von Java als primäre Unterrichtssprache möglicherweise ein größeres Problem darstellt als ich in den späten 90ern gedacht habe. Vergessen wir Pointer (Arithmetik), es scheint ein vollständiges Verständnis dessen zu fehlen, was ein zusammengesetzter Werttyp ist und warum er wichtig ist. C# hat es sicherlich inkludiert, C und C++ haben es offensichtlich, aber es fehlt sowohl Java als auch seinem JVM, bis die Valhalla-Initiative übernimmt.