У меня есть следующий код для создания наблюдаемого свойства для привязки данных. Это в работах, поэтому я не уверен, какова будет окончательная реализация, и я все еще довольно новичок в Swift.Слабая ссылка на закрытие в Swift
class Observable<T> {
typealias Observer = T -> Void
var value: T {
didSet {
for observer in self.observers {
observer?(self.value)
}
}
}
var observers: [Observer?] = []
init(_ val: T) {
self.value = val
}
}
Я хотел бы сохранить слабые ссылки на закрытие наблюдателя. Я не хочу полагаться на клиента, чтобы убедиться, что закрытие слабо/не используется, прежде чем передавать его через список захвата. Тем более, что на данном классе может быть много наблюдаемых свойств.
Возможно ли, чтобы ссылки на замыкание были слабыми в моем классе Observable?
UPDATE:
Я нашел несколько ресурсов, которые я думаю, поможет мне добиться того, чего я хочу:
Make self weak in methods in Swift
специально,
func methodPointer<T: AnyObject>(obj: T, method: (T) ->() -> Void) -> (() -> Void) {
return { [unowned obj] in method(obj)() }
}
Следующая ссылка относится к вышеуказанному ответу stackoverflow и идет более подробно:
http://blog.xebia.com/2014/10/09/function-references-in-swift-and-retain-cycles/
и это двустороннее связывание пример:
http://five.agency/solving-the-binding-problem-with-swift/
конкретно,
class BondBox<T> {
weak var bond: Bond<T>?
init(_ b: Bond<T>) { bond = b }
}
где слушатель обернут в классе под названием Бонд, который слабо ссылки в BondBox.
В конечном счете, я хочу, чтобы время жизни наблюдателя не зависело от времени жизни наблюдаемых классов. Разве это не проблема? – lintmouse
Конечно, это проблема. Но это не имеет никакого отношения к тому, что ссылка на слабость. Это связано с тем, что ссылка на наблюдаемый экземпляр внутри слабой функции. Только вызывающий может сказать «слабое», как вы сказали; нет волшебного пути вокруг него (конечно, сделать ссылку на слабую функцию не волшебным способом вокруг нее). – matt
Или вы могли бы очень разумно сделать 'self.value' слабым. Итак, если это произойдет, вы просто не будете называть наблюдателей. Довольно просто. Но, возможно, это не решит проблему, извините. – matt