Создание наблюдателей свойств в Swift

Я использую Property Observers манипулировать пользовательским интерфейсом и объектами, когда значение переменной изменилось. Имея это в виду, мне было интересно, возможно ли создать моих собственных наблюдателей за недвижимостью, таких как didSet а также willSet для моих собственных объектов. я ищу возможность написать что-то вроде этого:

var someArray: [String] {
    newElementAdded { *some code here* }
}

Как Вам известно didSet а также willSet не отслеживать, например, добавление элемента в массив, но, тем не менее, отслеживать изменения всего значения массива. Я с нетерпением жду, возможно, расширить это с помощью наблюдателей за недвижимостью. Я просмотрел документацию о замыканиях и свойствах и не смог найти никаких подсказок.

У меня вопрос, как я могу создать наблюдателей за недвижимостью? В качестве примера я привел один из приведенных выше вариантов использования, но я стремлюсь создать собственных наблюдателей.

1 ответ

Наблюдателей за имуществом более чем достаточно. Вы можете использовать что-то вроде этого:

var someArray: [String] = [] {
    didSet {
        stride(from: someArray.count, to: oldValue.count, by: 1).map {
            print("This index doesn't exist anymore:", $0)
        }

        stride(from: 0, to: min(oldValue.count, someArray.count), by: 1)
            .filter { oldValue[$0] != someArray[$0] }
            .forEach { print("The element at index", $0, "has a new value \"\(someArray[$0])\"") }

        stride(from: oldValue.count, to: someArray.count, by: 1).map {
            print("New value \"\(someArray[$0])\" in this index", $0)
        }
    }
}

someArray.append("Hello")
//New value "Hello" in this index 0

someArray.append("world")
//New value "world" in this index 1

someArray = ["Hello", "world"]
//Nothing is printed since no elements have changed

someArray.append("!")
//New value "!" in this index 2

someArray.remove(at: 1)
//This index doesn't exist anymore: 2
//The element at index 1 has a new value "!"

someArray.append(contentsOf: ["✋", ""])
//New value "✋" in this index 2
//New value "" in this index 3
Другие вопросы по тегам