Какова цель слова let внутри выражения catch? - PullRequest
2 голосов
/ 04 апреля 2019

В начале книги «Язык быстрого программирования» у них есть следующий пример

func makeASandwich() throws {
    // ...
}

do {
    try makeASandwich()
    eatASandwich()
} catch SandwichError.outOfCleanDishes {
    washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
    buyGroceries(ingredients)
}

Что мне интересно, так это строка

catch SandwichError.missingIngredients(let ingredients)

Конкретно синтаксис(let ingredients)

Мне кажется, они используют слово let для вызова функции, но, возможно, я ошибаюсь.В любом случае я хотел бы знать, какова цель слова let.

Ответы [ 3 ]

7 голосов
/ 04 апреля 2019

Это «шаблон привязки значения» (внутри «шаблона регистрационного перечисления»).

SandwichError - это перечисление с «связанными значениями», что-то вроде

enum SandwichError: Error {
     case outOfCleanDishes
     case missingIngredients([String])
}

Каждое ключевое слово catch сопровождается шаблоном, и если SandwichError.missingIngredients выдается ошибка с

throw SandwichError.missingIngredients(["Salt", "Pepper"])

затем

catch SandwichError.missingIngredients(let ingredients)

соответствует, и локальная переменная ingredients связана со связанным значением ["Salt", "Pepper"] для блока catch.

Он работает в основном так же, как и для Сопоставление значений перечисления с оператором переключения :

Вы можете проверить различные типы штрих-кодов, используя инструкцию switch, аналогично примеру в Сопоставлении значений перечисления с инструкцией Switch. Однако на этот раз связанные значения извлекаются как часть оператора switch. Вы извлекаете каждое связанное значение в виде константы (с префиксом let) или переменной (с префиксом var) для использования в теле корпуса коммутатора

1 голос
/ 04 апреля 2019

Перечисления в swift могут указывать связанные значения любого типа, которые будут сохраняться вместе с каждым другим значением регистра

enum SandwichError: Error {
     case outOfCleanDishes
     case missingIngredients([String])// associated value
}

При сопоставлении значений перечисления с оператором переключения Извлечение каждого связанного значения в виде константы (с префиксом let) или переменной (с префиксом var) для использования в теле корпуса коммутатора

var error = SandwichError.missingIngredients(["a", "b"])

switch productBarcode {
case . outOfCleanDishes:
    print("Out of clean dishes!")
case . missingIngredients(let ingredients):
    print("Missing \(ingredients)")
}
1 голос
/ 04 апреля 2019

Цель ключевого слова let используется для создания постоянной переменной.

В этом контексте ключевое слово let используется для создания локальной константы ingredients, которая используется для учета ожидаемых входных параметров, которые выдается как ошибка.

В этом примере все, что было найдено как отсутствующее ingredients, будет брошено, и catch SandwichError.missingIngredients(let ingredients) получит их внутри ingredients для обработки ошибки.

...