Swift指针使用(1)-UnsafePointer
2022-02-28 本文已影响0人
gerrywanggang
基本使用
var a = 5
let a_ptr = UnsafePointer<Int>.init(&a)
print(a_ptr.pointee)
运行结果:

UnsafePointer是不可变指针,也就是不能改变指针指向的地址的值。pointee是只读的,不能被赋值。
如下使用是错误的,编译报错。

注意,传入UnsafePointer的初始化的值用var修饰
在结构体中使用
struct Person {
var name: String
var age: Int
}
var person = Person.init(name: "xiaoli", age: 18)
let person_ptr = UnsafePointer<Person>.init(&person)
print(person_ptr.pointee)
运行结果:

在类中使用
在类中的使用和结构体完全相同.
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
var person = Person.init(name: "xiaoli", age: 18)
let person_ptr = UnsafePointer<Person>.init(&person)
person_ptr.pointee.age = 20
print(person_ptr.pointee.age)
不能够改变pointee, 但是类是引用类型,可以改变它的属性
运行结果

枚举、 泛型 和结构体使用一样
enum RequestResult {
case success
case failure
}
var r = RequestResult.success
let r_ptr = UnsafePointer<RequestResult>.init(&r)
print(r_ptr.pointee)
struct Animal<T> {
var rawData: T
func canMove() {
print("can move!")
}
}
var ani = Animal.init(rawData: 15)
let ani_ptr = UnsafePointer<Animal>.init(&ani)
print(ani_ptr.pointee.canMove())
运行结果
