2015-11-19 15 views
21

Giống như dưới đây, tôi muốn dừng đen bởi cái gì đó như breakBất kỳ cách nào để ngăn chặn một khối chữ trong nhanh chóng

var numbers = [1,2,3,4] 
numbers.forEach { 
    if $0 % 2 == 0 { 
     break 
    } 
} 
+0

bạn đang cố gắng làm gì? –

+0

Chỉ là một ví dụ ở đây, tôi chỉ muốn kiểm soát dòng chảy. –

+0

Tôi đã giải quyết. Xem http://stackoverflow.com/questions/33793880/any-way-to-stop-a-block-literal-in-swift/34787167#34787167 –

Trả lời

45

forEach không phải là một vòng lặp (nó là một khối truyền cho một vòng lặp, nhưng không phải là một vòng lặp chính nó), hoặc chính xác hơn, forEach không phải là một phần của Swift's Dòng điều khiển. Đó là lý do tại sao bạn không thể sử dụng break hoặc continue.

Chỉ cần sử dụng vòng lặp for-in.


Ví dụ:

var numbers = [ 1,2,3,4] 

func firstEvenNumber(inArray array: [Int]) -> Int? { 

    var firstMatch : Int? 

    for number in numbers { 
     if (number % 2) == 0 { 
      firstMatch = number 
      break 
     } 
    } 
    return firstMatch 
} 

firstEvenNumber(inArray: numbers) // 2 

Bạn có thể sử dụng return bên trong forEach đóng cửa, nhưng nó không nghỉ vòng lặp, nó chỉ lợi nhuận khối trong hiện tại vượt qua.

var numbers = [ 1,2,3,4] 

func evenNumbers(inArray: [Int]) -> [Int] { 

    var matches : [Int] = [] 

    numbers.forEach{ 
     if $0 % 2 == 0 { 
      matches.append($0) 
      return 
     } 
    } 
    return matches 
} 

evenNumbers(numbers) // [2,4] 
+0

thực sự, trong ví dụ thứ 2 'trả lại' Không lam gi cả. Loại bỏ nó và kết quả sẽ giống nhau. Để xem cách thức hoạt động trong foreach, hãy thử cách này: inArray.forEach { nếu $ 0% 2! = 0 { trả lại } kết quả khớp.append ($ 0) } – Aleksandr

+0

@Aleksandr chính xác là vấn đề. 'return' có sẵn bên trong' forEach' nhưng không có hiệu ứng mong muốn của OP. –

+0

Vì vậy, sử dụng: [y enumerateObjectsUsingBlock:^(id x, chỉ số NSUInteger, BOOL * stop) {}]; :) – Aleksandr

6

Tài liệu này đã giải thích.

/// - Note: You cannot use the `break` or `continue` statement to exit the 
    /// current call of the `body` closure or skip subsequent calls. 
    /// - Note: Using the `return` statement in the `body` closure will only 
    /// exit from the current call to `body`, not any outer scope, and won't 
    /// skip subsequent calls. 

Nhưng bạn muốn thử này.

extension CollectionType { 

    /// Use as 
    /// 
    ///  let num = [1,2,3,4,5] 
    ///  num.forEach{ 
    ///  if $1 > 3 { $2 = true } 
    ///  print($0,$1) 
    ///  } 
    func forEach(body: ((Self.Generator.Element, Int, inout Bool) -> Void)) { 
     var stop = false 
     let enumerate = self.enumerate() 
     for (index,value) in enumerate { 
      if stop { break } 
      body(value,index,&stop) 
     } 
    } 

    /// Use as 
    /// 
    ///  let num = [1,2,3,4,5] 
    ///  num.forEach{ 
    ///  if $0 > 3 { $1 = true } 
    ///  print($0) 
    ///  } 
    func forEach(body: ((Self.Generator.Element, inout Bool) -> Void)) { 
     var stop = false 
     for value in self { 
      if stop { break } 
      body(value,&stop) 
     } 
    } 
} 
Các vấn đề liên quan