在Swift中实现指针的最佳方法

时间:2016-06-08 15:09:57

标签: objective-c swift pointers

在Objective-C中,使用布尔指针停止枚举是很常见的,例如:

[myArray rh_iterate:^(id element, int index, BOOL *stop){
    // Do cool stuff
    *stop = YES;
}];

我已经实现了这个:

// This is in a category of NSArray
- (void)rh_iterate:(void (^)(id, int, BOOL *))block
{
    if (!block) { return; }

    BOOL stop = NO;
    for (int i = 0; i < self.count; i++) {
        block(self[i], i, &stop);
        if (stop) { return; } 
    }
}

我现在正在Swift中实现我的这个版本但是不依赖于任何Objective-C源代码。我知道swift喜欢限制指针的访问,那么实现它的最佳方法是什么? (理想情况下完全避免使用指针。)

编辑:

最直接的方式是:

func rh_iterate(callback: (Element, Int, UnsafeMutablePointer<Bool>) -> ()) {

        var stop: Bool = false
        for (index, element) in self.enumerate() {
            callback(element, index, &stop)
            if stop { return }
        }
    }

1 个答案:

答案 0 :(得分:2)

由于AMomchilov删除了他的答案,我会把它放回去。

直接等效于BOOL*模式将是一个输入变量

extension Array
{
    func iterateWithStop(closure: (Element, inout shouldStop: Bool) -> ()) -> Bool
    {
        var shouldStop = false
        for e in self
        {
            guard !shouldStop else { return false }
            closure(e, shouldStop: &shouldStop)
        }
        return !shouldStop
    }
}

如果迭代完成而没有关闭试图阻止它,则函数返回true,如果闭包试图阻止它,则返回false。

您可以这样使用它:

let myArray = [1, 2, 3,  -1, 4]

var sum = 0
let didProcessAllElements = myArray.iterateWithStop{ e, shouldStop in
    if e < 0 
    {
        shouldStop = true
    }
    else
    {
        sum += e
    }
}

// sum == 6

(在Swift 2.2的操场上测试)