2016-08-15 85 views
6

我對代碼塊或'範圍'的定義感到困惑。蘋果公司的警告說:這是另一個警衛聲明塊...如果Swift'guard'語句必須退出範圍,範圍的定義是什麼?

「必須傳輸控制以退出出現警戒語句的代碼塊」。

其他online sources表示警戒聲明必須存在它所在的'範圍'。

因此,採取下面的示例代碼:

func testGuardControlFlow() { 

let x = 2 
let y = 2 

    func embededFunc() { 

     if y == 2 { 

      guard x == 1 else { 
       print("oops, number is not 1") 
       return 
      } 

      print ("from in embededFunc") 

     } 

     print ("I still want this to print even if x != 1") 
    } 

    embededFunc() 
    print("Great, return still allows this to be printed.") 

} 

testGuardControlFlow() 

根據我目前的 '範圍' 的理解,代碼

if y == 2 {....} 

創建一個新的範圍,即在{}。考慮到這個假設,後衛只會逃避這個範圍。但事實並非如此。在這個例子中,守衛從其被放置的功能中逃脫出來,而不管它是否被埋在if子句中。

我完全誤解'範圍'的含義嗎?範圍意味着包含在方法中的代碼嗎?如果是這樣,if語句中存在的「空間」的正確術語是什麼?

+0

要求是else子句離開當前範圍。 'return'通過留下當然會留下當前範圍的整個函數來滿足要求。沒有必要在else子句中使用'return'。其他的東西會起作用,比如「繼續」。 – vacawama

回答

14

完全可以做你的設想,它恰好不是那個特定的代碼所做的。 return總是退出一個方法,而不是本地範圍。要做到你想要什麼,你可以使用一個標籤,break

func testGuardControlFlow() { 

    let x = 2 
    let y = 2 

    func embededFunc() { 

     breakLabel: 
     if y == 2 { 

      guard x == 1 else { 
       print("oops, number is not 1") 
       break breakLabel 
      } 

      print ("from in embededFunc") 

     } 

     print ("I still want this to print even if x != 1") 
    } 

    embededFunc() 
    print("Great, return still allows this to be printed.") 

} 

testGuardControlFlow() 

要添加到vadian's answer

guard強制你使用控制轉移語句退出的範圍。有4個提供給您:

  • returnthrow兩個出口的功能/方法
  • continue可以環(while/for/repeat-while
  • break可以在循環使用中被使用(while/for/repeat-while)退出直接範圍。指定要破解的標籤將允許您一次退出多個作用域(例如,突破嵌套的循環結構)。當使用標籤時,break也可以在if範圍內使用。

此外,您可以通過調用返回Never的函數退出該範圍,例如fatalError

+0

明白了。謝謝! –

+0

我忘了提及*爲什麼*你需要一個標籤來打破'if'。想要有條件地從循環中斷開是很常見的。這肯定比想要從'if'中斷''更普遍。因此,'if'語句中的'break'默認打破最接近的循環範圍。其他行爲來自明確指定標籤。 – Alexander

+0

@Alexander - 只是想確認一下 - 在封閉環境中使用時它是如何工作的?它是否退出關閉或實現關閉的功能? –

0

你錯誤地解釋了文檔所說的內容。警戒聲明本身不會退出任何範圍。你必須在守衛聲明中寫出一些聲明,該聲明退出包含守衛聲明的範圍。

return將退出範圍。在循環中,中斷或繼續將退出範圍。在很多情況下,goto將退出該站點。沒有具體的語句來退出if語句的範圍,因此您需要goto語句或退出循環或包含guard語句的函數的內容。

+1

'沒有具體的語句來退出if語句的範圍'False,'break'可以。 '所以你需要一個goto語句'Swift沒有'goto',但它不是必須的,無論如何,因爲'break'本質上是一樣的。 – Alexander

2

您對術語範圍的理解絕對正確。基本上它是兩個(平衡)大括號之間的空間。

說明退出代碼塊在文檔中是最準確的。

要退出guard語句,您可以使用控制轉移語句returnbreakcontinue,或throw

  • returnthrow退出整個功能或方法。
  • continuebreak退出當前範圍(例如switchforwhile)。