Создание наблюдателей свойств в Swift - PullRequest
0 голосов
/ 19 октября 2018

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

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

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

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

1 Ответ

0 голосов
/ 20 октября 2018

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

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
...