Ich habe eine Swift-Klasse, die eine Tabelle ihrer eigenen Methoden speichern muss. Leider verursacht dies einen Referenzzyklus, da seine Tabelle über die Methoden, die sie speichert, Verweise auf self
enthält.Machen Sie selbst schwach in Methoden in Swift
Beispiel undichter Code unten:
typealias Callback =()->()
class CycleInducingClass : NSObject {
var myCallbacks = [Callback]()
override init() {
super.init()
myCallbacks.append(myInternalFunction)
}
func myInternalFunction() {
NSLog("lolol: %d", self.myCallbacks.count)
}
}
Die einzige Lösung, die ich bisher gefunden habe, dies zu tun, anstatt:
myCallbacks.append({[unowned self] in self.myInternalFunction()})
Das ziemlich hässlich ist, und anfällig für Fehler. Irgendwelche besseren Ideen? Gibt es einen Trick, um die Funktionsreferenzen selbst schwach zu machen? d. h., um das myCallbacks
Array vom Typ myCallbacks : [WeakCallback]()
oder etwas zu machen? Soweit ich das beurteilen kann, kann ich nicht einmal eine Convenience-Funktion weaken
als syntaktischen Zucker über den hässlichen Verschluss-Wrapper oben bauen.
Wie wäre es, einen Parameter zu myInternalFunction hinzuzufügen? das könnte schwach erklärt werden ..... nicht schön, obwohl –
Ich habe auch versucht, nur alle meine internen Funktionen closures, dh 'let myInternalFunction = {[unowned self] in ...}' das funktioniert, ist aber auch eher hässlich. – wxs