如何使用属性观察器观察Swift集合类型的特定元素? [英] How can I observe a specific element with Swift collection types using property observers?

查看:123
本文介绍了如何使用属性观察器观察Swift集合类型的特定元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在回答

Inspired when answering the question of How do I know if a value of an element inside an array was changed?, The answer was using a Property Observer for checking if an array has been modified.

但是,如何确定属性查看器中集合类型中的已更新元素是什么?例如:

However, How can I determine what is/are the updated element(s) in a collection type in a property observer? For example:

class MyClass {
    var strings: [String] = ["hello", "world", "!"] {
        didSet(modifiedStrings) {
            print("strings array has been modified!!:")
            print(modifiedStrings)
        }
    }
}

let myClass = MyClass()
myClass.strings.append("a string")
myClass.strings[0] = "Hello"
myClass.strings.removeLast()

请注意,添加,更新或删除操作中的每一个都调用了didSet代码,但是我如何才能确切知道受影响的元素是什么?有没有办法通过将strings数组除以 Property Observer 来实现这一目标?

Note that the didSet code has been called for each of adding, updating or deletion operation, but how can I exactly know what are the effected elements? is there even a way to achive this by decalring strings array as a Property Observer?

我正在询问Swift中的所有集合类型,因为我认为对于所有它们而言,它应该是相同的行为,这与观察有关.

I am asking about all collection types in Swift because I assume that it should be the same behavior for all of them, it is about the observing.

谢谢.

推荐答案

感谢@hnh,基于他的 answer ,最后我得到了

Thanks for @hnh, based on his answer, I ended up with:

class MyNumber: NSObject {

    // NOTE that it works in both "willSet" and "didSet"

    /// Array ///
    var arrayNumbers: [String] = ["one", "two", "three"] {
        willSet {
            let oldStrings = Set(arrayNumbers)
            let newStrings = Set(newValue)

            print("removed from array: \(oldStrings.subtracting(newStrings))")
            print("added to array:   \(newStrings.subtracting(oldStrings))")

            print("----------")
        }
    }

    /// Set ///
    var setNumbers: Set = ["one", "two", "three"] {
        didSet(newSet) {
            print("removed from set: \(newSet.subtracting(setNumbers))")
            print("added to set:   \(setNumbers.subtracting(newSet))")

            print("----------")
        }
    }

    var dictionaryNumbers = ["1": "one", "2": "two", "3": "three"] {
        didSet(modified) {
            let oldKeys = Set(dictionaryNumbers.keys)
            let newKeys = Set(modified.keys)

            let oldValues = Set(dictionaryNumbers.values)
            let newValues = Set(modified.values)

            print("removed from dictionary (keys): \(newKeys.subtracting(oldKeys)) (values): \(newValues.subtracting(oldValues))")
            print("added to dictionary (keys):   \(oldKeys.subtracting(newKeys)) (values):    \(oldValues.subtracting(newValues))")
            print("----------")

//            print("removed (values): \(newValues.subtracting(oldValues))")
//            print("added (values):   \(oldValues.subtracting(newValues))")

        }
    }
}

执行:

let myNumber = MyNumber()

/// Array ///

// adding:
myNumber.arrayNumbers.append("four")
/* Logging:
 removed: [] means that nothing has been removed form the array
 added:   ["four"]
 ----------
 */

// updating:
myNumber.arrayNumbers[0] = "One"
/* Logging:
 removed: ["one"]
 added:   ["One"]
 ----------
 */

// deleting:
myNumber.arrayNumbers.removeLast()
/* Logging:
 removed: ["four"]
 added:   [] means that nothing has been added to the array
 ----------
 */


/// Set ///

// adding:
myNumber.setNumbers.insert("four")
/* Logging:
 removed from set: [] means that nothing has been removed form the set
 added to set:   ["four"]
 ----------
 */

// deleting:
myNumber.setNumbers.removeFirst()
/* Logging:
 removed from set: ["three"] // sets are unsorted...
 added to set:   [] means that nothing has been added to the set
 ----------
 */


/// Dictionary ///

// adding:
myNumber.dictionaryNumbers["4"] = "four"
/* Logging:
 removed from dictionary (keys): [] (values): []
 added to dictionary (keys):   ["4"] (values):    ["four"]
 ----------
 */

// updating:
myNumber.dictionaryNumbers["1"] = "One"
/* Logging:
 removed from dictionary (keys): [] (values): ["one"]
 added to dictionary (keys):   [] (values):    ["One"]
 ----------
 */

// deleting:
myNumber.dictionaryNumbers.removeValue(forKey: "2")
/* Logging:
 removed from dictionary (keys): ["2"] (values): ["two"]
 added to dictionary (keys):   [] (values):    []
 ----------
 */

这显示了如何处理数组,集合和字典.

This shows how to deal with array, set and dictionary.

这篇关于如何使用属性观察器观察Swift集合类型的特定元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆