2015-01-31 8 views
2

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

Концептуально, использование выглядит следующим образом:

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) 

Как я должен идти о распаковке/уничтожение того этот кортеж?

ответ

1

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

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

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

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