C union-Typ in Swift?
Wie kann ich erklären, und verwenden Sie eine C-union-Typ in Swift?
Habe ich versucht:
var value: union {
var output: CLongLong
var input: [CInt]
}
aber es funktioniert nicht...
AKTUALISIERT: will ich mit union zu Spalten 8 bytes number
2 x 4 bytes number
.
- Es gibt keine direkte Unterstützung von Gewerkschaften in den Swift, aber Sie verwenden können, enumeration, um erreichen Ihre Anforderung.
- Gewerkschaften sind disfavoured, die von fast jeder C und C++ coding standard kennen zu Mann, weil Sie so Häufig zum schreiben von nicht-portablen code. Wenn Sie eine Wahl in der Angelegenheit, nie mit einem
union
in C und in allen Fällen entpacken was auch immer Daten mit bit-wise Operatoren. - Ich würde nicht einverstanden mit Ihrer Prämisse. Zum Beispiel beim Empfang einer Nachricht, wobei die Nachricht kann eine beliebige von mehreren verschiedenen Formaten, ist es fast immer umgesetzt werden, da eine union von jenen Formaten, in der Regel, wo die erste, nicht-header-Feld gibt die Art der Meldung enthalten ist, in den rest der Nachricht, wo der rest der Nachricht ist definiert als die Vereinigung aller Nachrichtentypen.
- Dies ist genau das Szenario, welches ich gedacht habe. durch die Verwendung einer union hier versuchen wir zu überlagern, die ein Speicher-layout auf einer Byte - für-Instanz, empfangen von dem Netzwerk, oder einem anderen Prozess. Die Portabilität Gefahren sind unzählige, weil der Ausrichtung, Struktur, Verpackung und endianness unterschiedlicher Architekturen auf einem anderen.
- Es gibt bessere Möglichkeiten in solchen Situationen. In OOP-Sprachen, die Sie verwenden würden, Vererbung, jeden message-Typ, dargestellt durch eine andere Klasse, in C können Sie pseudo-Vererbung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als die Apple-Swift-Dokument , Enumerationen tun können, ähnliches und mehr.
1), Wenn Sie nur wollen, um split eine 8 Byte Zahl auf 2 x 4-Byte-zahlen, wie Sie vielleicht bekannte, die Bitweise Operation von Swift könnte helfen. Wie
2) Wenn Sie simulieren möchten die
union
Verhalten, wie dieC
Sprache,Ich habe versucht, einen Weg wie diese. Obwohl es funktioniert, es sieht schrecklich aus.
Gut, es ist keine direkte Unterstützung der Gewerkschaften, in Swift, aber wir verwenden können, enumeration, die für unsere Zwecke.
Ex-
8 bytes number
2 x4 bytes numbers
Swift rät "unsichere" Programmierung Muster wie
union
gibt es jedoch einen workaround. Es ist ein bisschen hässlich, aber der hier geht (mit Xcode 7.2)...Nun eine schnelle überprüfung der
sizeof(VariantA)
zeigt die gesamte Struktur noch dauert, bis nur noch acht bytes (das ist eine 64-bit-Ganzzahl). Wenn wir jetzt eine Instanz erstellen, wie diesvar a = VariantA(oneField: 1234567890987654321)
dann können wir die Abfrage der Komponenten, wie diesea.oneField
wird wieder der anfängliche Wert 1,234,567,890,987,654,321 und aucha.variantB.memory.firstField
zurück 2,976,652,465 unda.variantB.memory.secondField
zurück 287,445,236.Können wir ändern eine der Komponenten, wie diese
a.variantB.memory.firstField++
und dann beobachten Sie, dass diese änderungen den ursprünglichen Wert vona.oneField
zu 1,234,567,890,987,654,322 als erwartet.Die hässlichen Teile für mich sind die vorkommen der Wörter "unsicher", "Zeiger" und
.memory.
sowieaddressOf
Hilfsfunktion, die ist nur dazu da, um überwunden werden zu einem compiler-Fehler in Xcode 7.2!Vielleicht arbeiten mit Low-level-Strukturen, die erfordern, dass auf byte-Ebene manipulation wie sollte dies nicht getan werden in einer Hochsprache wie Swift überhaupt. Haben Sie sich überlegt zu schreiben, diesen Teil Ihres Projekts in einem .c-Datei? Mit einem geeigneten bridging-header können Sie immer noch die Mehrheit der Ihr Projekt in Swift.
Hier definiere ich
MyUnion
die zwei member mit dem Namenf
undg
. Wie Sie sehen können,union
ist unsicher, undenum
mit den zugehörigen Wert ist bevorzugt, obwohl es ein bisschen anders ausunion
.Gut, können Sie eine C-union in eine Struktur, die in ObjC-code, und die beim Import in swift wird es sich Verhalten wie es soll. Quelle: https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/using_imported_c_structs_and_unions_in_swift
"Swift Einfuhren C-Gewerkschaften, die als Swift-Strukturen. Obwohl Swift nicht nativ unterstützen, erklärte Gewerkschaften, die ein C in die union eingeführten Swift-Struktur, noch verhält sich wie eine C-union."
Ihre union nicht geben Sie den Typ der Struktur, so würde ich davon ausgehen, Sie sind immer ableiten, dass aus dem Kontext (wissen Sie immer, wenn der Wert entweder
output
oderinput
). In diesem Fall würde ich es übersetzen in zwei separate Strukturen:Wenn Sie wollen, dass die Strukturen haben einige gemeinsame Eigenschaften/Methoden deklarieren Sie eine
protocol
für Sie.