Использование инструкции 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.