微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift阵列地址与&array [0]不同

如何解决Swift阵列地址与&array [0]不同

Document说:

  • 一个包含可变类型,类型的可变变量,属性或下标引用的in-out表达式,该变量作为指针传递到左侧标识符的地址。
  • 一个[Type]值,作为指向数组开头的指针传递。

但是当我运行以下代码时:

func print<Type>(unsafePointer pointer: UnsafePointer<Type>) {
    print("\(pointer) ==> \(pointer.pointee) : \(Type.self)")
}

var array = [1,2,3,4]
print(unsafePointer: array)
print(unsafePointer: &array[0])

我明白了

0x0000000104204240 ==> 1 : Int
0x00007ffeefbff440 ==> 1 : Int

为什么他们的地址不同?

解决方法

这里

print(unsafePointer: array)

将指向数组存储的第一个元素的指针传递给该函数。还有这里

print(unsafePointer: &array[0])

在数组上调用下标运算符(返回Int),并将该(临时)整数的地址传递给函数,而不是原始数组元素的存储地址。

如果您两次调用函数,这将变得更加明显:

var array = [1,2,3,4]

print(unsafePointer: array)     // 0x00007ffeefbff2e0
print(unsafePointer: array)     // 0x00007ffeefbff2e0,same as previous address

print(unsafePointer: &array[0]) // 0x00007ffeefbff320
print(unsafePointer: &array[0]) // 0x00007ffeefbff340,different from previous address

此外,将in-out表达式传递给函数 可以创建临时副本,例如参见Swift: always copies on inout?

,

Swift中的数组具有值语义,而不是C或Objective-C中数组的引用语义。之所以看到不同的地址(和地址),是因为每次将数组作为参数传递时,实际上是在告诉Swift将Array结构桥接到NSArray实例。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。