2016-06-10 44 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语句是不准确的警卫让我们在循环内 –