Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift运行时如何处理元组?_Swift - Fatal编程技术网

Swift运行时如何处理元组?

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

我一直尝试在不使用临时值的情况下交换2个对象,如下所示:

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)是的,我们不能确定这一点,这只是理论。附言:爱你的博客!:)