在斯威夫特,你可以,如果讓可選的結合解開可選成常量或變量具有相同名稱的使用。爲什麼不讓警衛foo = foo有效?</p> <pre><code>func test() { let a: Int? = 1 if let a = a { print("a = (a)") } } </code></pre> <p>對於<code>if let</code>語句中的一切,可選<code>a</code>被解開成常規INT:
同樣,我可以用一個後衛語句來達到類似的效果
func test()
{
let a: Int? = 1
guard let requiredA = a else{
return
}
print("a = \(requiredA)")
}
但是,我不能用這樣的代碼:guard let a = a else
:
func test()
{
let a: Int? = 1
guard let a = a else{
return
}
print("a = \(a)")
}
爲什麼不呢?
在guard語句中,如果guard語句的條件失敗,則會執行else子句並退出當前作用域。如果條件成功,則從guard語句的右大括號到當前作用域的末尾創建一個新變量/常量。
爲什麼我不能用相同的方法將可選項映射到當前範圍其餘部分的同名變量/常量?
措施:我意識到這個問題不是一個完美的適合這個網站。我很樂意提出有關這個問題的更好的地方。
在我看來,'if'方法在不同的作用域中創建了兩個變量,這很好,而'guard'方法會在同一個作用域中創建兩個相同名稱的變量,這將是一個奇怪的特例,使可變分辨率規則複雜化以允許它。不過,我猜測,我不知道斯威夫特。 – user2357112