В Swift есть наблюдатели за недвижимостью, например:
var foo: [String] = [String]() {
didSet {
someFunction()
}
}
Здесь происходит всякий раз, когда массиву foo присваивается новое значение (например, foo = ["Ally", "Billy"] ) или новый элемент добавляется или удаляется из массива (например, foo.append("Willy") ); какая-то функция запущена.
Я пишу аналогичную логику в Котлине, например:
var foo: ArrayList<String> by Delegates.observable(ArrayList<String>()){
d, old, new ->
someFunction()
}
Поэтому, когда я пытаюсь присвоить foo ArrayList новое значение (например, foo = ArrayListOf("Billy", Willy")), запускается someFunction.
Проблема в том, что когда я добавляю новое значение в массив (или удаляю) с помощью
foo.add("Ally")
тогда некоторая функция не вызывается. Есть ли способ в Котлине это назвать? Другими словами, я хочу вызывать someFunction всякий раз, когда элемент добавляется или удаляется из массива foo...
Спасибо!





Написанный вами Delegates работает правильно, за исключением того, что он наблюдает за объектом ArrayList, а не за его содержимым.
Так что foo = listOf("foo") сработает someFunction, но не foo.add()
Что вы можете сделать, хотя
class observableList<Element>(
private val observer : () -> Unit
):ArrayList<Element>() {
override fun add(element: Element): Boolean = super.add(element).also { if (it) observer() }
// etc, override the other method similarly
}
Немного лучший стиль — использовать композицию вместо наследования: class ObservableList<Element>(private val base: MutableList<Element>, private val observer : () -> Unit): MutableList<Element> by base { override fun add(element: Element): Boolean = base.add(element).also { if (it) observer() } ...
Большое спасибо, Теовальд, это гениально - работает отлично!