Что означает ключевое слово "where"?

Я не мог понять точного смысла этого утверждения.

let x where x.hasSuffix("pepper")

Что это значит?

Примечание: Нет необходимости использовать let? Это заставляет меня сбивать с толку. Это достаточно x where x.hasSuffix("pepper")? потому что, let x должен быть уже назначен.?

Update: Из примечания @Jacky здесь это может означать то же, что и ниже.

let x = vegetable 
if (x.hasSuffix("pepper")
 ......

Ответ 1

where в этом контексте используется как сопоставление шаблонов. Из примера:

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

Когда суффикс x соответствует "pepper", он установит константу vegetableComment:

let vegetableComment = "Is it a spicy \(x)?"

Вы также можете видеть, что x не может быть "сельдереем", "огурцом" или "кресс-салатом", иначе это даст вам другой результат:

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"):. Вы можете попробовать изменить их порядок и передать значение "сельдерей", чтобы увидеть другой результат.

Edit:

По моему мнению, он создает константу x , если x суффикс - это "перец". Цель создания этой константы - использовать ее после этого:

let vegetableComment = "Is it a spicy \(x)?"

Изменить 2:

После немного большего количества исследований, называемых привязкой стоимости, и описывается как:

Случай переключения может привязывать значение или значения, которые он соответствует временному константы или переменные для использования в корпусе корпуса. Это известно как привязка значения, поскольку значения "привязаны" к временным константы или переменные в корпусе.

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

Ответ 2

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

Простым объяснением является то, что вы не можете сопоставить случай, который имеет тип String, с .hasSuffix(), потому что он возвращает Bool. Таким образом, они дают вам это ключевое слово соответствия where для использования. Он работает следующим образом:

  • let x копирует значение String, которое вы передаете в константу x.
  • where - это логическая оценка, которая только позволит случаю завершить совпадение, если ему задано истинное значение bool, как блок if.
  • hasSuffix() возвращает bool, требуемый where.

Если ваша строковая переменная, переданная в коммутатор, var foo. Вы можете буквально сделать это вместо этого:

case foo where foo.hasSuffix("pepper")

Вы можете передать true bool туда, где это возможно, и это будет работать, бесполезно:

case foo where true

Ответ 3

Это расширенный вид кода:

switch vegetable {

... omissis ...

case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?"
default:
    let vegetableComment = "Everything tastes good in soup."
}

То, что он делает, соответствует значению vegetable, присваивая его x и тестируя, имеет ли он суффикс "pepper". Если совпадение выполнено успешно, он выполняет блок case let vegetableComment = "Is it a spicy \(x)?", иначе он продолжит следующий тест (который в этом случае является default:).

Обратите внимание, что требуется let. Это означает, что вы привязываете новую переменную x.

Также обратите внимание, что это не то же самое, что

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

так как это всегда выполняется и входит в блок case, в то время как использование предложения where означает, что если условие не выполняется, совпадение не выполняется, и следующий case (или default) должен быть опробован.