Swift中的指针简单用法

Swift中指针分为两类:

  • typed pointer:指定数据类型指针,UnsafePointer<T>,T表示泛型
  • raw pointer:未指定数据类型指针(原生指针),UnsafeRawPointer

Swift 中的指针和 OC 中指针的对应关系如下:

 UnsafePointer:  可以通过ptr.pointee获取value, 但是无法修改指针的值

UnsafeMutablePointer : 可以通过ptr.pointee修改和获取value

var age : Int = 10
func test1(ptr : UnsafePointer<Int>) {
    let value = ptr.pointee // UnsafePointer只能获取,不能修改
    print(value)
}

func test2(ptr : UnsafeMutablePointer<Int>) {
    ptr.pointee += 1 // 修改,UnsafeMutablePointer 可修改,可获取
    print(ptr.pointee) // 获取
}

UnsafeRawPointer : 可以通过load来获取值, 需要指定获取值的类型, 不可以修改值

UnsafeMutableRawPointer : 可以通过load来获取值,  通过storeBytes来设置值, 都需要指定类型

var age : Int = 10
func test3(ptr : UnsafeRawPointer) {
    let value : Int = ptr.load(as: Int.self) // 获取
    print(value)
}

func test4(ptr : UnsafeMutableRawPointer) {
    ptr.storeBytes(of: 20, as: Int.self) // 修改
    let value : Int = ptr.load(as: Int.self) // 获取
    print(value)
}

指针的使用例子🌰

定义一个OC的数组,利用提供的enumerateObjects进行遍历。block里面的三个参数,第一个代表元素、第二个是索引,第三个就是指针了,这第三个指针就是OC中的BOOL *stop,因此在swift中的写法就是:

var arr = NSArray(objects: 11, 22, 33, 44)
arr.enumerateObjects { (<#Any#>, <#Int#>, <#UnsafeMutablePointer<ObjCBool>#>) in
    
}
arr.enumerateObjects { (element, index, stop) in
    print(index,element)
    if index == 2 {
        stop.pointee = true //等同于OC中 *stop = YES
    }
}

获得某个变量的指针

var age = 10

var ptr = withUnsafePointer(to: &age) { $0 }
print(ptr.pointee) // 10

var ptr2 = withUnsafeMutablePointer(to: &age) { $0 }
ptr2.pointee = 30
print(age) // 30

var ptr3 = withUnsafePointer(to: &age) { (p) -> UnsafePointer<Int> in
    return p
}
print(ptr3.pointee) // 30

var ptr4 = withUnsafeMutablePointer(to: &age) { (p) -> UnsafeMutablePointer<Int> in
    return p
}
ptr4.pointee = 50
print(age) // 50
var ptr5 = withUnsafePointer(to: &age) { UnsafeRawPointer($0) }
print(ptr5.load(as: Int.self)) // 50

var ptr6 = withUnsafeMutablePointer(to: &age) { UnsafeMutableRawPointer($0) }
ptr6.storeBytes(of: 100, as: Int.self)
print(age) // 100

获得指向堆空间实例的指针

class Person {}

var person = Person()

var ptr = withUnsafePointer(to: &person) { UnsafeRawPointer($0) }
var address = ptr.load(as: UInt.self) // person 地址值
var ptr2 = UnsafeMutableRawPointer(bitPattern: address) // 指向堆空间的地址值
print(ptr2!) // 0x0000000100669c10

print(Mems.ptr(ofRef: person)) // 0x0000000100669c10
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值