Ответ 1
Использование break с инструкцией if кажется немного ухищренным, и я не могу придумать, где стиль потребует его. Тем не менее, он сохраняет дополнительный уровень отступа при пропуске последней части оператора if в предложении if-else, что может быть полезно для глубоко вложенных циклов.
В других языках популярной (и/или противоречивой) идиомой является использование меток для обработки ошибок в глубоко вложенных функциях. Например, можно было бы вырваться из цикла при ошибке, например:
func testBreak3() {
// doesn't compile!!!
let a = false, b = true, x = 10, y = 20, err = true
if !a {
if b && x > 0 {
if y < 100 {
if err {
break handleError
}
// some statements
} else {
// other stuff
}
}
}
return // avoid error handling
handleError:
print("error")
// handle the error
}
Но в Swift (я использую 2.0 в качестве ссылки) метки отличаются от других языков; приведенный выше пример не компилируется по двум причинам: метка еще не объявлена, когда она используется, и метка должна быть непосредственно связана с оператором do
, while
, if
или case
. Кроме того, break внутри операторов if
или do
требует, чтобы оператор был помечен. Мы можем исправить это следующим образом, хотя изменения делают решение менее привлекательным из-за дополнительного отслеживания с помощью переменной errorFlagged
, делая рефакторинг более привлекательной:
func testBreak() {
let a = false, b = true, x = 10, y = 20, err = true
var errorFlagged = false
nestedIf: if !a {
if b && x > 0 {
if y < 100 {
if err {
errorFlagged = true
break nestedIf
}
// some statements
} else {
// other stuff
}
}
}
// skip handling if no error flagged.
if errorFlagged {
print("error")
// handle error
}
}