字典属性的Setter - 或者:从字典中获取最后添加的项目

时间:2015-11-21 23:07:57

标签: swift dictionary

我有一个具有不同计算属性的自定义类。其中一个是Dictionary [String: String]。 getter没问题,但我不知道如何使用setter:我怎么知道,字典中添加的最后一个值是什么?显然newValue.last不存在(.first!)。

修改

这似乎有效:

var myProp: [String: String] {
    get { ... }
    set {
        let lastVal = newValue[newValue.startIndex.advancedBy(newValue.count-1)]
        ...
    }

但是:这总是会返回最后一个附加值吗?

编辑2

第一次编辑错误。字典是无序的,并且通过这种方式它不确定,如果它真的返回最后添加的键和值。请参阅下面的答案。

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
    }
}