2015-11-19 5 views
21

Wie unten zu stoppen, will ich von etwas die wörtlichen stoppen wie breakJede Art und Weise einen Block wörtlichen in schnellen

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

Was versuchen Sie zu tun? –

+0

Nur ein Beispiel hier, ich will nur den Fluss steuern. –

+0

Ich habe gelöst. Siehe http://stackoverflow.com/questions/33793880/any-way-to-stop-a-block-literal-in-swift/34787167#34787167 –

Antwort

45

forEach keine Schleife ist (es ist ein Block mit einer Schlaufe geführt, aber nicht ein Schleife selbst), oder genauer forEach ist nicht Teil von Swifts Kontrollfluss. Aus diesem Grund können Sie break oder continue nicht verwenden.

Verwenden Sie einfach eine For-In-Schleife.


Beispiel:

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 

Sie return innerhalb des forEach Verschluss verwenden, aber es funktioniert nicht Pause die Schleife, nur kehrt der Block in der aktueller Durchlauf

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

tatsächlich werfen, im zweiten Beispiel 'Rückkehr' tut nichts. Entfernen Sie es und das Ergebnis wird gleich sein. Um zu sehen, wie es in foreach funktioniert, versuchen Sie dies: inArray.forEach { if $ 0% 2 = 0 { return } matches.append ($ 0) !} – Aleksandr

+0

@Aleksandr, das genau ist der Punkt. 'return' ist in' forEach' verfügbar, hat aber nicht den gewünschten Effekt des OPs. –

+0

Verwenden Sie also: [y enumerateObjectsUsingBlock:^(ID x, NSUInteger-Index, BOOL * stop) {}]; :) – Aleksandr

6

Das Dokument erläutert.

/// - 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. 

Aber Sie würden es ausprobieren.

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) 
     } 
    } 
} 
Verwandte Themen