gpt4 book ai didi

arrays - 如何使用属性观察器观察具有 Swift 集合类型的特定元素?

转载 作者:搜寻专家 更新时间:2023-11-01 05:52:47 24 4
gpt4 key购买 nike

在回答How do I know if a value of an element inside an array was changed?的问题时受到启发,答案是使用 Property Observer 检查数组是否已被修改。

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

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 来实现?

我问的是 Swift 中的所有集合类型,因为我认为它们应该具有相同的行为,这是关于观察的。

谢谢。

最佳答案

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

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): []
----------
*/

这显示了如何处理数组、集合和字典。

关于arrays - 如何使用属性观察器观察具有 Swift 集合类型的特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41120656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com