Подтвердить что ты не робот

Быстрое "where" ключевое слово

Отказ от ответственности: swift noob

Привет, я только начал изучать Swift и проходил через Swift Programming Language (книга Apple, выпущенную во время WWDC) и задавался вопросом, что такое ключевое слово "where". Он использовался в

let vegetable = "red pepper"
switch vegetable {
case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
    let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?"
default:
    let vegetableComment = "Everything tastes good in soup."
}

Отрывок из: Apple Inc. "Быстрый язык программирования". интерактивные книги. https://itun.es/us/jEUH0.l

Если кто-нибудь может объяснить и/или показать эквивалент на другом языке (java, С++, obj-c и т.д.), это было бы здорово.

Извините, если это уже было задано, я ничего не видел.

4b9b3361

Ответ 1

Операторы Swift switch намного мощнее, чем те, которые используются на большинстве других языков. Вместо того, чтобы просто выбирать из группы значений, они используют сопоставление образцов, чтобы выбрать, какой case для оценки. Давайте посмотрим на каждый case из вашего примера:

case "celery":

Super simple - это будет соответствовать строке "celery" и больше ничего.

case "cucumber", "watercress":

Этот случай будет соответствовать строке "cucumber" или строке "watercress". Круто. На других языках вам, вероятно, потребуется использовать провальный случай, чтобы получить оба из них.

case let x where x.hasSuffix("pepper"):

Этот случай содержит два понятия, которые являются особыми для операторов Swift switch, по сравнению с Java и C. Первый - привязка значения - часть let x этого оператора связывает согласованное значение с константой x который привязан к корпусу тела.

Далее - это предложение where. Это логический тест, как и оператор if, поэтому случай соответствует только выражению true. В этом примере x.hasSuffix("pepper") просматривает связанное значение и проверяет, заканчивается ли оно с "pepper". Строки "red pepper", "green pepper" и "spicy hot pepper" будут совпадать, но "peppercorns" не будет.

default:

В Swift операторы switch должны исчерпывать все возможные значения согласованного значения, поэтому они обычно заканчиваются блоком case default: для обработки любого значения, которое ранее не было сопоставлено. Единственный раз, когда вы не увидите этого, - это то, что вы сопоставляете enum только с несколькими значениями, поскольку вы можете вручную исчерпать все параметры.

Ответ 2

Вы можете включить несколько необязательных привязок в одном операторе if и использовать предложение where для проверки булевого условия:

if let firstNumber = Int("4"), secondNumber = Int("42") where firstNumber < secondNumber {
    print("\(firstNumber) < \(secondNumber)")
}
// prints "4 < 42