Ausgabe
Von Objective-C kommend, können Sie Funktionen objc_setAssociatedObject
zwischen 2 Objekten aufrufen, damit sie eine Referenz beibehalten, was praktisch sein kann, wenn Sie zur Laufzeit nicht möchten, dass ein Objekt zerstört wird, bis auch seine Referenz entfernt wird. Hat Swift etwas Ähnliches?
Lösung
Hier ist ein einfaches, aber vollständiges Beispiel, das aus der Antwort von jckarter abgeleitet wurde .
Es zeigt, wie man einer bestehenden Klasse eine neue Eigenschaft hinzufügt. Dazu wird eine berechnete Eigenschaft in einem Erweiterungsblock definiert. Die berechnete Eigenschaft wird als zugeordnetes Objekt gespeichert:
import ObjectiveC
// Declare a global var to produce a unique address as the assoc object handle
private var AssociatedObjectHandle: UInt8 = 0
extension MyClass {
var stringProperty:String {
get {
return objc_getAssociatedObject(self, &AssociatedObjectHandle) as! String
}
set {
objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
BEARBEITEN:
Wenn Sie das Abrufen des Werts einer nicht initialisierten Eigenschaft unterstützen und den Fehler vermeiden möchten unexpectedly found nil while unwrapping an Optional value
, können Sie den Getter wie folgt ändern:
get {
return objc_getAssociatedObject(self, &AssociatedObjectHandle) as? String ?? ""
}
Beantwortet von – Klaas
Antwort geprüft von – Mildred Charles (FixError Admin)