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

最佳答案

UnsafeMutablePointer 是一个结构体,但它声明

public struct UnsafeMutablePointer<Pointee> : Strideable, Hashable {

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

}

这里的“nonmutating set”是指设置属性不会发生变异
指针变量本身的状态。

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

关于swift - 为什么可以更改由 let 声明的结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47284027/

10-11 21:50