当前位置: 首页 > 面试题库 >

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

胡璞瑜
2023-03-14
问题内容

回答“ 我如何知道数组内元素的值是否已更改”这一问题时受到启发 ,答案是使用
属性观察 器检查数组是否已被修改。

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

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,根据他的回答,我最终得到了:

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

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



 类似资料:
  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 导览 本小节主要介绍 Apache ShardingSphere 可观察性的相关功能 应用性能监控集成

  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular

  • 我对Observables和RxJs是新手,我想对回报进行调整。如果第一个选择器返回某个值,我希望第二个选择器可以观察到。但是如果第一个选择器没有返回那个特定的值,我想返回false,而不是(false)。我已经走了这么远,但这返回了一个可观察的结果

  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首

  • 问题内容: 我正在尝试将项目设置为表视图,但是setitems方法需要一个可观察的列表,而我的模型中却有一个可观察的集合.FXCollections实用程序类没有给定可观察的集合来创建可观察的列表的方法。类强制转换异常(按预期)。 目前,我正在使用这种代码 而且我有一些问题: 在表中进行编辑是否会按预期更新基础集? 这是这样做的“正确”方法吗 简而言之,我需要样式指南或最佳做法,以便在可观察集和可