Mam klasę Swift, która musi przechowywać tabelę własnych metod. Niestety powoduje to cykl odniesienia, ponieważ jego tabela zachowuje odwołania do self
za pomocą metod, które przechowuje.Słabość w metodach w Swift
Przykład kodu nieszczelny poniżej:
typealias Callback =()->()
class CycleInducingClass : NSObject {
var myCallbacks = [Callback]()
override init() {
super.init()
myCallbacks.append(myInternalFunction)
}
func myInternalFunction() {
NSLog("lolol: %d", self.myCallbacks.count)
}
}
Jedynym rozwiązaniem znalazłem tak daleko jest zamiast tego zrobić:
myCallbacks.append({[unowned self] in self.myInternalFunction()})
To dość brzydkie, i podatne na błędy. Jakieś lepsze pomysły? Czy istnieje jakaś sztuczka, która sprawia, że same odwołania do funkcji są słabe? tj. utworzyć tablicę myCallbacks
typu myCallbacks : [WeakCallback]()
lub coś podobnego? O ile mogę powiedzieć, nie mogę nawet zbudować funkcji wygody weaken
jako cukru syntaktycznego nad brzydkim opakowaniem zamknięcia powyżej.
Co powiesz na dodanie parametru do mojejInternalFunkcji? które można by uznać za słabe ..... niezbyt ładne. –
Próbowałem też po prostu zamknąć wszystkie wewnętrzne funkcje, tj. 'let myInternalFunction = {[unowned self] in ...}' działa, ale jest również raczej brzydki. – wxs