在Swift中,解构分配是否保证为并行分配?

在Swift中,解构分配是否保证为并行分配?,swift,assignment-operator,destructuring,Swift,Assignment Operator,Destructuring,我在看Swift语言参考资料。是否保证并行执行分解分配?与串行分配相反。我在赋值运算符的描述中看不到这一点 需要明确的是,(a,b)=(b,a)(其中a和b是var)是否保证等同于foo=a,a=b,b=foo,其中foo是一个保证不存在的变量,而不是a=b,b=a(这将产生具有相同值的a和b)。我尝试了(a,b)=(b,a),它似乎并行工作,但这与行为的文档描述不同。元组是值类型,一旦构建,它们就独立于作为其一部分的值 var a=2 var b=3 变量t1=(a,b) 打印(t1)/(2,

我在看Swift语言参考资料。是否保证并行执行分解分配?与串行分配相反。我在赋值运算符的描述中看不到这一点


需要明确的是,
(a,b)=(b,a)
(其中
a
b
var
)是否保证等同于
foo=a
a=b
b=foo
,其中
foo
是一个保证不存在的变量,而不是
a=b
b=a
(这将产生具有相同值的
a
b
)。我尝试了
(a,b)=(b,a)
,它似乎并行工作,但这与行为的文档描述不同。

元组是值类型,一旦构建,它们就独立于作为其一部分的值

var a=2
var b=3
变量t1=(a,b)
打印(t1)/(2,3)
a=4
打印(t1)/(2,3)

因此,元组
(a,b)
携带两个变量的实际值,这就是
(b,a)=(a,b)
赋值工作没有问题的原因。在幕后,实际赋值是
(b,a)=(2,3)
(假设
a
b
具有上述代码片段中的值).

元组是值类型,一旦构建,它们就独立于作为其一部分的值

var a=2
var b=3
变量t1=(a,b)
打印(t1)/(2,3)
a=4
打印(t1)/(2,3)

因此,元组
(a,b)
携带两个变量的实际值,这就是
(b,a)=(a,b)
赋值工作没有问题的原因。在幕后,实际赋值是
(b,a)=(2,3)
(假设
a
b
具有上述代码片段中的值)

“但这与记录的行为描述不同。”好吧,文档中没有提到它,所以你不能说它不“相同”。不幸的是,有很多东西文档没有说。既然文档没有说,我就称之为“实现细节”“是swift编译器的。@Sweeper据我所知,OP是在询问这个赋值是否有可能导致
a
b
造成重击,或者反过来。如果是这样的话,这是语言语义的一个重要问题,而不仅仅是实现细节。”我尝试了(a,b)=(b,a)它似乎是并行工作的,但这与记录的行为描述不同。“你认为哪个“记录的行为描述”是矛盾的?你指的是“赋值是从值的每个部分执行到表达式的相应部分”这句话吗?@Alexander我知道,但文档中没有说明是否会发生碰撞。因此,这是一个实现细节,从某种意义上说,是由编译器决定如何处理赋值。理论上,我可以编写一个编译器,其工作原理几乎与
swiftc
类似,只是它在序列,但仍然称之为“Swift编译器”,因为它执行了引用中所述的操作。@Sweeper你确定你真的要这样做吗?1)没有语言委员会和规范使你能够更快地移动waaaaaay,2)Swift只有两个实现(据我所知,Swift.org和Silver Elements编译器),因此,与JS(有几十个实现)等不同,几乎不需要同步许多独立的工作团队。“但这与行为的文档描述不同。”文档中没有提到它,所以不能说它“不一样”。不幸的是,医生们没有说很多事情。既然文档没有说,我就称之为swift编译器的“实现细节”。@Sweeper据我所知,OP是在问这个任务是否可能以导致
a
撞击
b
的方式发生,或者反之亦然。如果是这样的话,这是语言语义的一个重要问题,而不仅仅是一个实现细节。“我尝试了(a,b)=(b,a),它似乎并行工作,但这与行为的文档化描述不同。”你认为哪一个“行为的文档化描述”是矛盾的?你指的是“赋值是从值的每个部分到表达式的相应部分执行的”这句话吗?@Alexander我知道,但文档没有说明是否会发生碰撞。因此,这是一个实现细节,从某种意义上说,编译器决定如何处理赋值。从理论上讲,我可以编写一个编译器,它的工作原理几乎与swiftc类似,只是它按顺序赋值,并且仍然称它为“Swift编译器”,因为它执行引用中所说的操作。@Sweeper您确定要这样做吗?1) 没有语言委员会和规范使您能够更快地移动waaaaay,2)Swift只有两个实现(据我所知,Swift.org和Silver Elements编译器),因此与JS(有几十个实现)等不同,几乎不需要同步许多独立的工作组。