In Swift wird eine String
Struktur auch als Klassenobjekt behandelt, wie bei der Verwendung der Methode NSCoder
encodeObject(_:forKey:)
. Ich weiß, dass String
direkt mit der objective-c-Klasse, NSString
, überbrückt wird, aber gibt es eine Möglichkeit, eine benutzerdefinierte struct
zu erstellen, die sich ähnlich verhält? Vielleicht überbrück es zu einer benutzerdefinierten Klasse? Ich möchte in der Lage sein, so etwas zu tun:
Ich habe eine funktionierende, elegante Lösung gefunden, die mit einem _ObjectiveCBridgeable
struct
funktioniert, das von NSCoder
; Danke an die Referenz das Martin R zur Verfügung gestellt. Hier ist der Bibliothekscode, den ich für alle Interessierten geschrieben habe. Ich kann jetzt so etwas machen:
SortedArray.swift
%Vor%NSSortedArray.swift
%Vor%NSCoder.swift
%Vor%Dies ist derzeit nicht möglich. SE-0058 wird darauf eingehen, wird aber von Swift 3 zurückgestellt Eine endgültige Umsetzung von SE-0058 würde hoffentlich mehr als nur die ObjC-Überbrückung ermöglichen. zum Beispiel erlaubt C ++ oder .NET Bridging auch in einer allgemeineren Lösung.
Letztendlich ist das Bridging zwischen String
und NSString
ziemlich einfach.
NSString
hat nur 2 Instanzvariablen (Der Stringzeiger nxcsptr
und die Länge nxcslen
). String
verwendet _StringCore
, das nur 3 Eigenschaften hat ( _baseAddress
, _countAndFlags
und < a href="https://github.com/apple/swift/blob/045bc16b6d7d6a9dbd3e08b5943d9fefca4a194a/stdlib/public/core/StringCore.swift#L33"> _owner
). Die Umwandlung hin und her ist fest codiert und wird vom Compiler explizit aufgerufen. Es gibt kein automatisches System, das zum Generieren von Klassen aus Strukturen implementiert ist oder umgekehrt.
Sie müssen ein struct
/ class
-Paar implementieren (wie bei String
und NSString
) und Initialisierer implementieren, die eines aus dem anderen konstruieren.