2016-06-10 53 views
2

我想在guard語句中使用break,但是編譯器告訴我斯威夫特利用後衛聲明破

「休息」,只允許在一個循環中,如果這樣做,或交換機

可以寫這樣的代碼片段(這只是一個MCV)?

func test(string: String?, x: Int) { 
     print("Function Scope BEGIN") 
     if x > 4 { 
      guard let pr = string else { break } 
      print(pr) 
     } 
     else { 
      print("Not") 
     } 
     print("Function Scope END") 
    } 
+5

你認爲'break'會做什麼? (即'test(nil,x:5)'的預期輸出是什麼?) – kennytm

+0

你基本上在這裏使用'goto'。考慮重構。 – Alexander

+0

@kennytm這不是實際的代碼,這是一個例子,預期的結果是不打印pr但打印「Function Scope END」 – Andrea

回答

7

是的,這是可能的。您可以在循環內使用未標記的break語句,但不能在if區塊內使用。你可以使用標記break聲明雖然。例如,你的代碼的這個版本可以工作:

func test(string: String?, x: Int) { 
    print("Function Scope BEGIN") 
    someLabel: if x > 4 { 
     guard let pr = string else { break someLabel } 
     print(pr) 
    } 
    else { 
     print("Not") 
    } 
    print("Function Scope END") 
} 
+2

這本質上是一個「goto」。 IT是一個非常強烈的跡象表明這應該設計得更好。 – Alexander

+0

@AMomchilov這是一個值得關注的問題,但問題是如果可能的話,而不是它是否是一個好的設計:) –

+0

是的,我沒有爲你燒烤。你的回答是完全正確的,但它解決了一個問題,如果它設計得更好,就不應該存在。我認爲這值得指出。 – Alexander

2

一個break語句只能一個guard let內部使用,如果後衛-LET是一個循環中。

在你的用例中,我會說你應該使用if-let來代替,因爲return的替代選項不是我們所期望的。

func test(string: String?, x: Int) { 

     print("Function Scope BEGIN") 
     if x > 4 { 

      if let pr = string { print(pr) } 

     } 
     else { 

      print("Not") 
     } 
     print("Function Scope END") 
    } 
+0

如果break語句只能在'guard-let'中使用,那麼break語句是不準確的警衛讓我們在循環內 –