Beim Experimentieren mit Swift, kommend aus einer Java-Hintergrund, warum möchtest du eine Struktur anstelle einer Klasse wählen? Es scheint, dass sie dasselbe sind, wobei eine Struktur weniger Funktionalität bietet. Warum sollte man sie dann wählen?
Antworten
Zu viele Anzeigen?Da Structs Werttypen sind und du den Speicher sehr einfach erstellen kannst, der in den Stapel gelegt wird. Structs können leicht zugänglich sein und nach dem Scope der Arbeit wird er leicht aus dem Stapelspeicher dealloziert, indem er sich vom oberen Teil des Stapels entfernt. Andererseits ist Klasse ein Verweistyp, der im Heap gespeichert wird, und Änderungen an einem Klassenobjekt werden sich auf ein anderes Objekt auswirken, da sie eng gekoppelt sind und Verweistyp sind. Alle Mitglieder einer Struktur sind öffentlich, während alle Mitglieder einer Klasse privat sind.
Der Nachteil von Struct ist, dass es nicht vererbt werden kann.
Strukturen und Klassen sind gute Optionen zur Speicherung von Daten und Modellierung von Verhalten in Ihren Apps, aber ihre Ähnlichkeiten können es schwierig machen, eine über die andere zu wählen.
Berücksichtigen Sie die folgenden Empfehlungen, um zu entscheiden, welche Option Sinn macht, wenn Sie einen neuen Datentyp zu Ihrer App hinzufügen.
- Verwenden Sie standardmäßig Strukturen.
- Verwenden Sie Klassen, wenn Sie die interoperabilität mit Objective-C benötigen.
- Verwenden Sie Klassen, wenn Sie die Identität der Daten steuern müssen, die Sie modellieren.
- Verwenden Sie Strukturen zusammen mit Protokollen, um Verhalten durch gemeinsame Implementierungen zu übernehmen.
Quelle- Apple Dokumentation
- See previous answers
- Weitere Antworten anzeigen
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.