创建可以添加和删除项目的块(或函数)集合的最佳方法是什么?
项目将从各种入口点添加(这实际上是一个回调机制),我希望能够从多个点中删除集合中的块。
编辑:最初这个问题集中在可持续性上,希望我能找到一种使用Set的方法。由于how to test blocks for equality的问题,这给我带来了重复的标签。我不认为该问题的答案排除了块的轻量级哈希方法,但该问题的答案确实排除了直接使用函数指针。我已经改变了试图摇动标签的问题。
var block={(x:Int) in print(x+1)}
我正在尝试制作一系列可以以相当高的更新速率(100的Hz)执行的块。我可以创建一个块数组,但是如果没有先确定它的索引就不能删除它,并且每当删除一个索引时索引都会改变,所以存储索引是没用的。
var ary:[Int->()]=[]
ary.append(block)
下一个最好的选择似乎是创建一组块,只要我保留了一个副本,就可以删除一个成员。问题是,我不能制作一组不符合Hashable的对象。
var aset:Set<Int->()> //type 'Int -> ()' does not conform to protocol 'Hashable'
NSBlockOperation
是块的对象包装版本。 NSOperation
s,但是是一次性对象,所以我需要每次都重建NSBlockOperation
。这导致两个复杂因素:必须在每次调用后重新创建NSOperation
,以及significant overhead of creating NSOperation
s。必须重新创建NSOperation
仍然意味着我需要保留一系列我可以添加和删除的块 - 所以我回到了我开始的地方......
另一种选择是使用包含在某些逻辑中的Dictionary来为每个提交的块生成唯一键。我认为这会起作用,但似乎比我需要的逻辑更多。
struct BlockCollection : SequenceType {
private static var idx=0
var blockDict:[Int:Int->()]=[:]
mutating func addBlock(b:Int->()) -> Int {
blockDict[BlockCollection.idx]=b
BlockCollection.idx+=1
return BlockCollection.idx-1
}
mutating func dropBlock(k:Int) {
blockDict.removeValueForKey(k)
}
func generate() -> AnyGenerator<Int->()> {
var dgen=blockDict.generate()
return anyGenerator {
return dgen.next()?.1
}
}
}
块基本上是函数指针,对吗?有没有办法访问指针值并将其用作哈希?这是一个合理的解决方案吗? [编辑:否,正如关于相等性的问题所示,优化后函数指针不可靠。]