Swift 字典属性的Setter-或:从字典中获取最后添加的项
我有一个具有不同计算属性的自定义类。其中之一是Swift 字典属性的Setter-或:从字典中获取最后添加的项,swift,dictionary,Swift,Dictionary,我有一个具有不同计算属性的自定义类。其中之一是[String:String]的字典。getter是没有问题的,但是我不知道如何使用setter:我怎样才能弄清楚,最后添加到字典中的值是什么?显然,newValue.last不存在(.first有!) 编辑: 这似乎有效: var myProp: [String: String] { get { ... } set { let lastVal = newValue[newValue.startIndex.advanc
[String:String]
的字典。getter是没有问题的,但是我不知道如何使用setter:我怎样才能弄清楚,最后添加到字典中的值是什么?显然,newValue.last
不存在(.first有!)
编辑:
这似乎有效:
var myProp: [String: String] {
get { ... }
set {
let lastVal = newValue[newValue.startIndex.advancedBy(newValue.count-1)]
...
}
但是:这是否总是返回最后一个附加值
编辑2
第一次编辑是错误的。字典是无序的,这样就不确定它是否真的返回最后添加的键和值。请参阅下面的答案。正如您所指出的,字典是键-值对的无序集合,因此没有最后一个
getter(第一个
只是为了方便起见,在Objective-C中更恰当地称之为任何对象
)。字典也不记录添加的订单项
要获得最后一项,有两种可能。您可以重构以使用数组,例如元组(键、值)
;或者,您可以跟踪添加到单独变量中的最后一项
但可能对“二传手”有误解。setter设置整个对象
set { myProp = newValue }
因此,如果您有一个myProp=[“foo”:“bar”]
,myProp中的整个字典都会被这些数据覆盖
您需要的是向属性添加一个键。在Swift中,这是通过订阅完成的
myProp["foo"] = "bar"
您不必在get
闭包中实现任何特殊功能
但是请注意,您必须记住两件事:首先,字典必须正确初始化;其次,如果新值使用相同的键
,则任何现有项都将被覆盖 我现在明白了。。。这本字典杂乱无章。要真正获得最后一个附加值,我必须将值本身与新值进行比较。工作守则:
var myProp: [String: String] {
get { // doing things to read the things and add them to a dictionary }
set {
var new = newValue
for (key, value) in myProp {
if new[key] == value {
new.removeValueForKey(key)
}
}
// now 'new' should only have one key and one value, that one, that just was added
}
}
字典是键/值对的无序集合。首先返回的一对
不一定是首先添加到词典的那一对。啊,你比我的编辑速度快;)谢谢这意味着我的假设是正确的,即顺序可以不同于加法的顺序?是的,你不应该对字典中键/值对的顺序进行任何假设。我使用getter和setter是有原因的,谢谢,但没有误解。我正在使用libxml,在getter部分我正在读取节点的属性,在setter部分我想设置它们。。。但只有一个改变了。我有解决办法,答案如下……这在你的问题中并不清楚。你可以反复浏览这些项目,并检查哪一个是新的。是的,可能不完全清楚,但正如你所说:否则我的问题就没有任何意义;)我的解决方案确实知道如何进行迭代。