В чем разница между использованием `let` в переключателе в начале или в () - PullRequest
7 голосов
/ 11 июня 2019

Я немного сомневаюсь в let position в корпусе коммутатора, вот простой код, который лучше

enum Result{
    case success(code:Int)
    case fail(err:NSError)
}

var result = Result.success(code: 3)

switch result {
case  .success(let code):// first
case let .success(code)://second
    print("success",code)
default:
    print("fail")
}

Ответы [ 3 ]

5 голосов
/ 11 июня 2019

case .success(let code):

Этот синтаксис используется, когда enum указывает значение let. В этом случае enum Result указывает, что case success также будет включать значение Int для code.

Использование let сразу после case в операторе switch обычно используется вместе с предложением where, чтобы учесть более сложные значения case в операторе switch. Примером такого может быть как ниже

var text = "Hello"
var greetings = ["Hello", "Good Bye"]

switch text {
case let value where greetings.contains(value):
    print("Yes")
default:
    print("No")
}
3 голосов
/ 11 июня 2019

Как Язык программирования Swift: Перечисление: Связанные значения говорит:

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

switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

Если все связанные значения для случая перечисления извлекаются как константы, или если все извлекаются как переменные, для краткости можно поместить одну аннотацию var или let перед именем случая:

switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

Короче говоря, они эквивалентны, и последний является полезным сокращением, когда вы извлекаете более одного связанного значения.

1 голос
/ 11 июня 2019
case .success(let code):// first
case let .success(code)://second

В примерах, как вы их показали, нет никакой разницы. Оба законны, и оба делают одно и то же. В этом контексте они эквивалентны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...