我有一个具有不同计算属性的自定义类。其中一个是Dictionary
[String: String]
。 getter没问题,但我不知道如何使用setter:我怎么知道,字典中添加的最后一个值是什么?显然newValue.last
不存在(.first!)。
修改
这似乎有效:
var myProp: [String: String] {
get { ... }
set {
let lastVal = newValue[newValue.startIndex.advancedBy(newValue.count-1)]
...
}
但是:这总是会返回最后一个附加值吗?
编辑2
第一次编辑错误。字典是无序的,并且通过这种方式它不确定,如果它真的返回最后添加的键和值。请参阅下面的答案。
答案 0 :(得分:-1)
正如您所指出的,Dictionary是 unorderd 键值对的集合,因此没有last
getter(first
只是方便了Objective-C更恰当地称为anyObject
)。字典也不跟踪添加的订单项。
要获得最后一项,有两种可能性。您可以重构使用数组,例如元组(key, value)
;或者您可以跟踪在单独变量中添加的最后一项。
但也许对“制定者”存在误解。 setter 设置整个对象。
set { myProp = newValue }
因此,如果您有myProp = ["foo": "bar"]
,则myProp中的整个字典将被此数据覆盖。
您想要的是添加该属性的密钥。在Swift中,这是通过下标来完成的。
myProp["foo"] = "bar"
您不必在get
闭包中实现任何特殊内容。
请注意,您必须记住两件事:首先,必须正确初始化字典;第二,如果新值使用相同的key
,则将覆盖任何现有项。
答案 1 :(得分:-1)
我现在明白了......字典是无序的。要真正获得最后的附加值,我必须将值本身与newValue进行比较。工作代码:
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
}
}