在Swift中,字典的属性观察器(Property observers)是什么?

3

当我的字典添加新条目时,我希望调用委托方法。对于单个值属性,didSet(newValue)观察器可以正常工作。但是对于我的字典来说,似乎下面的newUser参数返回整个字典。

var userIdKeyedDict:Dictionary<String, User> = [:] {
    didSet(newUser) {
    println("Updating userIdKeyedDict")
    self.delegate.didAddUser(newUser)
} 
willSet(newUser) {
  println("Will set \(newUser)")
}

willSet(newUser) 的输出结果为:

将要设置 [3E33BD4D-6F48-47FC-8612-565250126E51: 用户:userId:Optional("3E33BD4D-6F48-47FC-8612-565250126E51"),listenerUUID:Optional("77D01D6F-D017-EF9E-55A9-78570E455C51"),beaconUUID:nil]

随着更多的项目被添加,newUser 简单地包含整个字典。

如何仅获取新添加的项目?

3个回答

4
最简单的方法是使用下标,它们提供了一种灵活的方式来为键分配下标值,允许代码在更新字典或内部对象结构之前和之后进行处理。有关下标的更多信息,请查看以下链接:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html

我已经包含了一些示例代码以帮助。

class User {
    var userId:String = NSUUID.init().UUIDString
    var name:String = "Your Users Name"
}

class UserDictionary {
    var users = [String:User]()
    subscript(userId:String) -> User? {
        get {
            return users[userId]
        } set {
            // if newValue is nil then you are about to remove user
            users[userId] = newValue
            // do after value processing.
            print("[\(userId)]=\(newValue)")
        }
    }
}

var userdict = UserDictionary()
let user = User()
userdict[user.userId] = user

0

这并不是一件容易的事情。Dictionary 不是一个类,你不能重写它的函数或者观察属性。下面是一个类似数组的对象的例子,可以观察元素何时被添加、移除等等。 当元素被添加/移除到数组中时得到通知


0
如果您能够计算两个字典之间的差异,那么您可以记住字典的先前状态。每当willSet(或didSet)被触发时,您可以计算先前状态和新状态之间的差异。差异就是您所做的更改,例如删除或添加元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接