如何在Swift中创建块集合?

时间:2016-05-11 07:12:16

标签: swift collections block

创建可以添加和删除项目的块(或函数)集合的最佳方法是什么?

项目将从各种入口点添加(这实际上是一个回调机制),我希望能够从多个点中删除集合中的块。

编辑:最初这个问题集中在可持续性上,希望我能找到一种使用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 NSOperations。必须重新创建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
        }
    }
}

块基本上是函数指针,对吗?有没有办法访问指针值并将其用作哈希?这是一个合理的解决方案吗? [编辑:否,正如关于相等性的问题所示,优化后函数指针不可靠。]

0 个答案:

没有答案