Swift:同时将元组解包为可变和不可变变量

exi*_*all 5 coding-style tuples destructuring mutability swift

我有一个 Swift 函数,它返回两个值的元组。第一个值通常(但并非总是)用作调用者中一段可变状态的“更新”版本(我知道我也可以使用inout它而不是元组,但这使得它更烦人保留旧状态的同时保留新状态)。第二个值是函数生成的通常不可变的返回值,其无意覆盖任何现有的可变状态。

从概念上讲,用法如下:

var state = // initialize
(state, retval1) = process(state)
(state, retval2) = process(state)
(state, retval3) = process(state)
Run Code Online (Sandbox Code Playgroud)

显然,这里的问题是retval1retval2、 和retval3从未被声明,编译器会生气。

state必须是 avar并且不能重新声明,所以我不能写

let (state, retval) = process(state)
Run Code Online (Sandbox Code Playgroud)

但是,retval永远不会被修改,并且应该let作为最佳实践和良好编码风格的问题来声明。

我希望以下语法可能有效,但事实并非如此:

(state, let retval) = process(state)
Run Code Online (Sandbox Code Playgroud)

我应该如何解压/解构这个元组?

Air*_*ity 4

let我不相信\xe2\x80\x99t 存在\xe2\x80\x99s 与和同时绑定的语法var

\n\n

有趣的是,您可以在以下位置执行此操作switch

\n\n
let pair = (1,2)\nswitch pair {\ncase (var a, let b):\n    ++a\ndefault:\n    break\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是(var a, let b) = pair(或类似的变体) don\xe2\x80\x99t 似乎是可能的。

\n