2016-06-08 31 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