为什么可以更改由 let 声明的结构?
Why a struct declared by let can be changed?
在下面的代码中,'ptr'是一个let声明的结构体,但是它的成员变量'pointee'是可以改变的,为什么?
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
这里,ptr
是常量,所以你不能给它分配一个新的UnsafeMutablePointer
,但是它包含的结构是可以修改的。简而言之,您无法将任何内容重新分配给 let
实体,但您可以访问和修改其属性。
对于指针,您不能更改它指向的内存地址,但可以更改存储在该内存地址的数据。
指针仅存储对内存地址的引用,因此只要该地址是常量,指针就不会更改其值。
指针不是结构。
它是引用类型,不同于值类型的结构。
由于您将指针声明为可变的,因此您可以更改 pointee
(内存的内容)但不能更改引用本身。
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
也可以为ptr.pointee
分配一个新值
是常数,下标也一样setter:
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
ptr[0] = 2
在下面的代码中,'ptr'是一个let声明的结构体,但是它的成员变量'pointee'是可以改变的,为什么?
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
这里,ptr
是常量,所以你不能给它分配一个新的UnsafeMutablePointer
,但是它包含的结构是可以修改的。简而言之,您无法将任何内容重新分配给 let
实体,但您可以访问和修改其属性。
对于指针,您不能更改它指向的内存地址,但可以更改存储在该内存地址的数据。 指针仅存储对内存地址的引用,因此只要该地址是常量,指针就不会更改其值。
指针不是结构。
它是引用类型,不同于值类型的结构。
由于您将指针声明为可变的,因此您可以更改 pointee
(内存的内容)但不能更改引用本身。
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
也可以为ptr.pointee
分配一个新值
是常数,下标也一样setter:
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
ptr[0] = 2