Использование инструкции break в переключателе
Ниже приведен пример использования операторов break в коммутаторе:
let numberSymbol: Character = "三" // Simplified Chinese for the number 3
var possibleIntegerValue: Int?
switch numberSymbol {
case "1", "١", "一", "๑":
possibleIntegerValue = 1
case "2", "٢", "二", "๒":
possibleIntegerValue = 2
case "3", "٣", "三", "๓":
possibleIntegerValue = 3
case "4", "٤", "四", "๔":
possibleIntegerValue = 4
default:
break
}
if let integerValue = possibleIntegerValue {
println("The integer value of \(numberSymbol) is \(integerValue).")
} else {
println("An integer value could not be found for \(numberSymbol).")
}
possibleIntegerValue
- optional Int
, поэтому я действительно не считаю это лучшим примером использования перерывов в коммутаторе. Вместо разрыва работает даже possibleIntegerValue = nil
.
let numberSymbol: Character = "三" // Simplified Chinese for the number 3
var possibleIntegerValue: Int?
switch numberSymbol {
case "1", "١", "一", "๑":
possibleIntegerValue = 1
case "2", "٢", "二", "๒":
possibleIntegerValue = 2
case "3", "٣", "三", "๓":
possibleIntegerValue = 3
case "4", "٤", "四", "๔":
possibleIntegerValue = 4
default:
possibleIntegerValue = nil
}
if let integerValue = possibleIntegerValue {
println("The integer value of \(numberSymbol) is \(integerValue).")
} else {
println("An integer value could not be found for \(numberSymbol).")
}
Таким образом, в этом случае break
вообще не требуется. Может ли кто-нибудь дать мне правильный пример использования перерывов в коммутаторе, где я намеренно должен игнорировать некоторые случаи?
В книге говорится:
Это поведение может использоваться для сопоставления и игнорирования одного или нескольких случаев в switch. Поскольку инструкция switch Swifts является исчерпывающей и не допускает пустых случаев, иногда необходимо сознательно сопоставлять и игнорировать случай, чтобы сделать ваши намерения ясными. Вы сделайте это, написав инструкцию break как весь корпус дела вы хотите игнорировать. Когда этот случай согласован с оператором switch, оператор break в этом случае завершает инструкции переключателя немедленное выполнение.
Ответы
Ответ 1
Оператор break
внутри switch
может использоваться, когда вам не нужен случай, чтобы иметь какую-либо фактическую функциональность, но хотите включить его, чтобы сделать вашу логику проще или понятнее. Предположим, например, вы хотите использовать оператор switch
, чтобы определить, является ли данный год високосным годом или нет. (Это немного надуманный пример.)
func isLeapYear(year: Int) -> Bool {
switch (year) {
case let x where (x % 100) == 0 && (x % 400) != 0:
break
case let x where (x % 4) == 0:
return true
default:
break
}
return false
}
isLeapYear(2014) // false
isLeapYear(2000) // true
isLeapYear(1900) // false
Первый случай оператора switch
внутри isLeapYear
позволяет вам замаскировать случаи, когда год делится на 100 и не делится на 400, так как это своего рода исключительные непиковые годы. Оператор break
в этом случае означает "ничего не делать".
Ответ 2
Язык Swift требует, чтобы каждый оператор switch
рассматривал все возможные случаи. Если субъектом оператора switch
является Character
, как в вашем примере, оператор switch
должен содержать случай для каждого возможного символа. Так как это, очевидно, нецелесообразно, также возможно включить метку default:
, которая соответствует всякому совпадению ни с одним из других case
.
Вы спросили: "Когда я буду намеренно игнорировать некоторые случаи? Ответ заключается в том, что вам всегда нужно учитывать все случаи, касающиеся языка, поэтому, если субъект вашего оператора switch
может принять значение, которое вас не интересует, - значение, которое не требует дальнейшей обработки, - тогда вам нужно добавить случай default
, чтобы поймать эти значения. Если вы действительно не хотите что-либо делать в своем случае default
, тогда синтаксис языка требует, чтобы у вас был этот оператор break
- у вас нет ничего между default:
и закрывающим }
switch
.