2016-06-08 67 views
0

在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 } 
     } 
    } 
+3

我的绝招,从一种语言翻译成另一种是......忘记了语言。用简单的英语句子*阅读原文*,例如“好的,它需要这个东西,然后它循环并删除它,然后......”。一旦你把这个过程当作句子,用新语言重新实现它比用真正的翻译更容易。 – Moritz

+2

@EricD进入Swift的图像汇编程序员询问如何在寄存器1上“隐藏”1 – Alexander

+1

准确地说。除非你只是为了好奇而问,否则你不一定要用Objective-C的相同逻辑来解决Swift中的问题。告诉我们问题是什么,我们会帮助你。 –

回答

2

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

直接等同于BOOL*模式将是一个INOUT变量

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 
    } 
} 

如果迭代没有闭合试图阻止它,假,如果关闭并试图阻止其完成该函数返回真。

你会使用这样的:

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 

(在操场上进行测试雨燕2.2)

+0

我刚刚为此创建了一个'XCTest',它很好地工作。 –

+1

通过一些工作,您可以将它变成“SequenceType”的扩展,然后它可以在任何序列上使用。 – JeremyP