为什么let声明的结构可以改变?

时间:2017-11-14 11:01:09

标签: swift struct let unsafemutablepointer

在下面的代码中,'ptr'是let声明的结构,但是它的成员变量'pointee'可以改变,为什么?
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1) ptr.pointee = 1

4 个答案:

答案 0 :(得分:2)

此处,ptr是常量,因此您无法为其分配新的UnsafeMutablePointer,但可以修改其中包含的结构。简而言之,您无法将任何内容重新分配给let实体,但您可以访问和修改其属性。

答案 1 :(得分:2)

指针不是结构。

它是一种引用类型,与结构类型不同。

由于您将指针声明为可变,因此可以更改pointee(内存的内容),但不能更改引用本身。

答案 2 :(得分:1)

如果是指针,则无法更改其指向的内存地址,但可以更改存储在该内存地址的数据。 指针只存储对存储器地址的引用,因此只要该地址是常量,指针就不会改变其值。

答案 3 :(得分:0)

UnsafeMutablePointer 结构,但它声明了

public struct UnsafeMutablePointer<Pointee> : Strideable, Hashable {

    public var pointee: Pointee { get nonmutating set }
    public subscript(i: Int) -> Pointee { get nonmutating set }

}

这里&#34;非突变集&#34;意味着设置属性不会发生变异 指针变量本身的状态。

因此即使ptr.pointee ptr,也可以为let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1) ptr.pointee = 1 ptr[0] = 2 分配新值 是一个常量,下标setter也是如此:

("1200x1024+100+10")