是否可以观察到添加到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”
答案 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
如果目标元素尚未存在,则将它们插入到集合中。
E.g:
func insert(Element)