Почему структура, объявленная let, может быть изменена?
В следующем коде ptr является структурой, объявленной let, но ее переменная-член pointee может быть изменена. Почему?
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
4 ответа
UnsafeMutablePointer
это структура, но она объявляет
public struct UnsafeMutablePointer<Pointee> : Strideable, Hashable {
public var pointee: Pointee { get nonmutating set }
public subscript(i: Int) -> Pointee { get nonmutating set }
}
Здесь "немутирующий набор" означает, что установка свойства не изменяет состояние самой переменной-указателя.
Следовательно ptr.pointee
может быть назначено новое значение, даже если ptr
является константой, и то же самое верно для установщика индекса:
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
ptr[0] = 2
Вот, ptr
является постоянным, поэтому вы не можете назначить новый UnsafeMutablePointer
к нему, но структура, в которой он находится, может быть изменена. Короче говоря, вы не можете ничего переназначить let
сущность, но вы можете получить доступ и изменить ее свойства.
Указатель не является структурой.
Это ссылочный тип в отличие от структуры, которая является типом значения.
Поскольку вы объявляете указатель как изменяемый, вы можете изменить pointee
(содержимое памяти), но вы не можете изменить саму ссылку.
В случае указателя вы не можете изменить адрес памяти, на который он указывает, но вы можете изменить данные, хранящиеся по этому адресу памяти. Указатель хранит только ссылку на адрес памяти, поэтому, пока этот адрес является постоянным, Указатель не изменял свое значение.