Swift运行时如何处理元组?
我一直尝试在不使用临时值的情况下交换2个对象,如下所示:Swift运行时如何处理元组?,swift,Swift,我一直尝试在不使用临时值的情况下交换2个对象,如下所示: var a = "Hello, " var b = "world!" (a,b) = (b,a) a // "world!" b // "Hello, " 有人知道这种语言是如何做到这一点的吗?第二个元组(b,a)是存储在内存中以允许第一个元组重新分配自己,还是通过切换引用来完成这一切 提前感谢这种“切换”具有以下功能: 替换类类型的指针 var classA = NSString(string: "foo") var
var a = "Hello, "
var b = "world!"
(a,b) = (b,a)
a // "world!"
b // "Hello, "
有人知道这种语言是如何做到这一点的吗?第二个元组(b,a)是存储在内存中以允许第一个元组重新分配自己,还是通过切换引用来完成这一切
提前感谢这种“切换”具有以下功能:
- 替换类类型的指针
var classA = NSString(string: "foo") var classB = NSString(string: "bar") NSLog("%p %p", classA, classB) // 0x7fecd351def0 0x7fecd341cc30 (classA, classB) = (classB, classA) NSLog("%p %p", classA, classB) // 0x7fecd341cc30 0x7fecd351def0
var valueA = "baz" var valueB = "qux" NSLog("%p %p", valueA, valueB) // 0x7fecd34201b0 0x7fecd34211e0 (valueA, valueB) = (valueB, valueA) NSLog("%p %p", valueA, valueB) // 0x7fecd351c880 0x7fecd351de90
- 为值类型创建新的值(副本)
var classA = NSString(string: "foo") var classB = NSString(string: "bar") NSLog("%p %p", classA, classB) // 0x7fecd351def0 0x7fecd341cc30 (classA, classB) = (classB, classA) NSLog("%p %p", classA, classB) // 0x7fecd341cc30 0x7fecd351def0
var valueA = "baz" var valueB = "qux" NSLog("%p %p", valueA, valueB) // 0x7fecd34201b0 0x7fecd34211e0 (valueA, valueB) = (valueB, valueA) NSLog("%p %p", valueA, valueB) // 0x7fecd351c880 0x7fecd351de90
swap
global函数。但我从来没有遇到过元组交换的问题;它就像Ruby一样。它不会为值类型(如String
)切换引用。您可以通过在切换前后添加NSLog(“%p%p”,a,b)
来确认这一点。您在逻辑级别上完全正确,但请记住a)字符串也部分类似于具有写时复制功能的引用类型,(b)编译器可以进行优化,因此在实践中,“这到底是做什么的”这个问题的答案是“取决于很多事情”(此外,日志记录更改了编译器可能正在执行的操作,因为您正在强制它执行可能已优化的操作–例如,对于原始代码,b
的值实际上会直接放入a
&vv)是的,我们不能确定这一点,这只是理论。附言:爱你的博客!:)