Как назначить переменную в операторе Swift case

Это работает, но кажется неэффективным:

switch var1 {
case 1:
    string1 = "hello"
case 2:
    string1 = "there"
default:
    string1 = "world"
}

но

string1 = switch var1 { ...

вызывает ошибку. Существует ли более эффективный способ записи коммутатора/случая, чтобы назначенная переменная не была избыточно указана в каждой строке?

Спасибо заранее!

Ответ 1

Вы можете поместить свой блок switch в функцию, которая возвращает объект String, и назначить возврат этой функции вашей переменной string1:

func foo(var1: Int) -> String {
    switch var1 {
    case 1:
        return "hello"
    case 2:
        return "there"
    default:
        return "world"
    }
}

/* Example */
var var1 : Int = 1
var string1 : String = foo(var1) // "hello"
var1 = 2
string1 = foo(var1)              // "there"
var1 = 5000
string1 = foo(var1)              // "world"

В качестве альтернативы пусть string1 будет вычисленным свойством (например, в некотором классе), в зависимости от значения say var1, и поместите блок switch в getter этого свойства. На игровой площадке:

var var1 : Int
var string1 : String {
    switch var1 {
    case 1:
        return "hello"
    case 2:
        return "there"
    default:
        return "world"
    }
}

/* Example */
var1 = 1
print(string1) // hello
var1 = 2
print(string1) // there
var1 = 100
print(string1) // world

Если используется в классе, просто пропустите блок примера выше.

Ответ 2

Поместите switch в анонимное закрытие, если вы будете использовать этот код только в одном месте.

string1 = {
    switch var1 {
    case 1:
        return "hello"
    case 2:
        return "there"
    default:
        return "hello"
    }
}()

Ответ 3

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

let map = [1: "hello", 2: "there"]
value = map[var1] ?? "world"

Или в одном операторе и с использованием индекса по default:

let value = [1: "hello", 
             2: "there"][var1, default: "world"]

Аргумент по default передаваемый вызову нижнего индекса, работает так же, как предложение по default из switch