Swift: распаковка кортежа в изменяемые и неизменяемые переменные одновременно

У меня есть функция Swift, которая возвращает кортеж из двух значений. Первое значение обычно, но не всегда, используется как «обновленная» версия части изменяемого состояния в вызывающем объекте (я знаю, что мог бы также использовать для этого inout вместо кортежа, но это делает его более раздражающим сохранить старое состояние при сохранении нового). Второе значение — обычно неизменное возвращаемое значение, создаваемое функцией, которое не предназначено для переопределения любого существующего изменяемого состояния.

Концептуально использование выглядит так:

var state = // initialize
(state, retval1) = process(state)
(state, retval2) = process(state)
(state, retval3) = process(state)

Проблема здесь, очевидно, в том, что retval1, retval2 и retval3 никогда не объявляются, и компилятор злится.

state должно быть var и не должно быть переобъявлено, поэтому я не могу писать

let (state, retval) = process(state)

Однако retval никогда не изменяется и должно быть объявлено с let в соответствии с рекомендациями и хорошим стилем кодирования.

Я надеялся, что следующий синтаксис может работать, но это не так:

(state, let retval) = process(state)

Как мне распаковать/разрушить этот кортеж?


person exists-forall    schedule 31.01.2015    source источник


Ответы (1)


Я не верю, что существует синтаксис для одновременной привязки let и var.

Интересно, что вы можете сделать это в switch:

let pair = (1,2)
switch pair {
case (var a, let b):
    ++a
default:
    break
}

Но (var a, let b) = pair (или подобные варианты) не кажутся возможными.

person Airspeed Velocity    schedule 31.01.2015