观察添加到Set - Swift的值

时间:2016-10-12 12:07:46

标签: ios swift

是否可以观察到添加到private static IEnumerable<string> SplitRelativePath(string path){ do{ yield return path; var lastIndex=path.LastIndexOf('\\'); if(lastIndex==-1) yield break; path=path.Substring(0, lastIndex); } while(path!=null); } //usage SplitRelativePath(@"Customer\Calls\A1\A2\A3\A4"); /* result: C:\Customer\Calls\A1\A2\A3\A4 C:\Customer\Calls\A1\A2\A3 C:\Customer\Calls\A1\A2 C:\Customer\Calls\A1 C:\Customer\Calls C:\Customer C:\ * 数据结构的值?

我想要实现的目标:

Set

例:
var storedStrings = Set<String>() { didSet (value) { // where value is a string that has been added to the Set } }
didSet调用,因为添加了一个新值。

storedStrings.insert("hello")
didSet再次召唤。

storedString.insert("world")
didSet未被调用,因为该集已经包含字符串“hello”

3 个答案:

答案 0 :(得分:4)

这可能有点贵,但您仍然可以执行以下操作:

var storedStrings = Set<String>() {
    didSet {
        if storedStrings != oldValue {
            print("storedStrings has changed")
            let added = storedStrings.subtracting(oldValue)
            print("added values: \(added)")
            let removed = oldValue.subtracting(storedStrings)
            print("removed values: \(removed)")
        }
    }
}

答案 1 :(得分:2)

insert函数返回一个定义为(inserted: Bool, memberAfterInsert: Element)的元组。

因此,可以在插入时检查新的唯一元素,而不是使用didSet

var storedStrings = Set<String>()

var insertionResult = storedStrings.insert("Hello")
if insertionResult.inserted {
    print("Value inserted") // this is called
}

insertionResult = storedStrings.insert("Hello")
if insertionResult.inserted {
    print("Value inserted") // this isn't called
}

答案 2 :(得分:0)

您可以为您的集合实现自己的插入器,它可以模拟属性观察器的使用,利用insert Set方法返回其第一个成员为{的元组的事实{1}}如果要插入的元素已经存在。

false
     

如果目标元素尚未存在,则将它们插入到集合中。

来自the language reference

E.g:

func insert(Element)