Swift
中也有專門的指針類型,這些都被定義為Unsafe
(不安全的),常見的有以下4種類型
-
UnsafePointer<Pointee>
類似于const Pointee *
-
UnsafeMutablePointer<Pointee>
類似于Pointee *
-
UnsafeRawPointer
類似于const void *
-
UnsafeMutableRawPointer
類似于void *
func test1(_ ptr: UnsafePointer<Int>) {
print("test1", ptr.pointee)
}
func test2(_ ptr: UnsafeMutablePointer<Int>) {
ptr.pointee = 20
print("test2", ptr.pointee)
}
var age = 10
test1(&age) // test1 10
test2(&age) // test2 20
func test3(_ ptr: UnsafeRawPointer) {
print("test3", ptr.load(as: Int.self))
}
func test4(_ ptr: UnsafeMutableRawPointer) {
ptr.storeBytes(of: 30, as: Int.self)
}
var num = 10
test3(&num) //test3 10
test4(&num)
print(num) // 30
指針的使用例子??
定義一個(gè)OC
的數(shù)組,利用提供的enumerateObjects
進(jìn)行遍歷。block
里面的三個(gè)參數(shù),第一個(gè)代表元素劳闹、第二個(gè)是索引,第三個(gè)就是指針了洽瞬,這第三個(gè)指針就是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
}
}
獲得某個(gè)變量的指針
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
獲得指向堆空間實(shí)例的指針
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