美文网首页
Swift5.1学习随笔之指针

Swift5.1学习随笔之指针

作者: SAW_ | 来源:发表于2020-05-15 15:28 被阅读0次

Swift中也有专门的指针类型,这些都被定义为Unsafe(不安全的),常见的有以下4种类型

  1. UnsafePointer<Pointee>类似于const Pointee *
  2. UnsafeMutablePointer<Pointee>类似于Pointee *
  3. UnsafeRawPointer类似于const void *
  4. 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

指针的使用例子🌰

定义一个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

相关文章

  • Swift5.1学习随笔之指针

    Swift中也有专门的指针类型,这些都被定义为Unsafe(不安全的),常见的有以下4种类型 UnsafePoin...

  • Swift5.1学习随笔之fatalError

    如果遇到严重问题,希望结束程序运行,可以直接使用fatalError函数抛出错误(这是无法通过do-catch捕捉...

  • Swift5.1学习随笔之mutating

    结构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改在func关键字前面加mutating可以允...

  • Swift5.1学习随笔之常量

    Swift中的常量用let修饰 1、只能赋值一次 2、它的值不要求在编译时期确定,但是使用之前必须赋值一次 3、常...

  • Swift5.1学习随笔之@discardableResult

    在func前面加@discardableResult,可以消除:函数调用后返回值未被使用的警告⚠️ 或者可以用下划...

  • Swift5.1学习随笔之属性

    swift中跟实例相关的属性可以分为2大类 1、存储属性(Stored Property)2、计算属性(Compu...

  • Swift5.1学习随笔之协议Protocol

    协议Protocol 协议可以用来定义方法、属性、下标声明,协议可以被枚举、结构体、类遵守(多个协议用逗号隔开) ...

  • Swift5.1学习随笔之扩展(Extension)

    Swift中的扩展,类似于OC中的分类Category 扩展可以为枚举、类、结构体、协议添加新功能可以添加方法、计...

  • Swift5.1学习随笔之函数func

    Swift中的函数用func关键字定义 举个? 无返回值的函数 有3中表达写法 隐式返回 如果整个函数体是一个单一...

  • Swift5.1学习随笔之字面量

    直接写出来的true就是字面量,表示Bool类型的字面量为true、flase 字符串String的字面量为“ja...

网友评论

      本文标题:Swift5.1学习随笔之指针

      本文链接:https://www.haomeiwen.com/subject/qwgqohtx.html