catch表达式中的let的目的是什么?

时间:2019-04-04 07:06:04

标签: swift syntax keyword

在一本书“快速编程语言”中,他们有以下示例

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一词,但也许我弄错了。无论如何,我想知道让单词的目的是什么。

3 个答案:

答案 0 :(得分:7)

这是一个“值绑定模式”(在“枚举案例模式”内部)。

SandwichError是带有“关联值”的枚举,类似于

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

每个catch关键字后跟一个模式,如果引发SandwichError.missingIngredients错误,则

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

然后

catch SandwichError.missingIngredients(let ingredients)

匹配,并且局部变量ingredients绑定到catch块的关联值["Salt", "Pepper"]

它的工作原理与Matching Enumeration Values with a Switch Statement相同:

  

您可以使用switch语句检查不同的条形码类型,类似于将枚举值与Switch语句匹配的示例。但是,这次,关联值被提取为switch语句的一部分。您可以将每个关联的值提取为常量(带有let前缀)或变量(带有var前缀),以便在开关盒的主体内使用

答案 1 :(得分:1)

使用let关键字的目的是创建一个常量变量。

在此上下文中,关键字let用于创建局部常量ingredients,该常量用于容纳作为错误抛出的预期输入参数。

在此示例中,将抛出所有丢失的ingredientscatch SandwichError.missingIngredients(let ingredients)将在ingredients内接收它们,以处理错误。

答案 2 :(得分:1)

迅速的枚举可以指定要存储的任何类型的关联值以及每个不同的大小写值

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

使用Switch语句匹配枚举值时 提取每个关联值作为常量(带有let前缀)或变量(带有var前缀),以在开关盒的主体内使用

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

switch productBarcode {
case . outOfCleanDishes:
    print("Out of clean dishes!")
case . missingIngredients(let ingredients):
    print("Missing \(ingredients)")
}