美文网首页
iOS - swift 类与结构体 方法的派发

iOS - swift 类与结构体 方法的派发

作者: Th丶小伟 | 来源:发表于2022-09-02 10:57 被阅读0次

异变方法

Swift 中 class 和 struct 都能定义方法。但是有一点区别的是默认情况 下,值类型属性不能被自身的实例方法修改。

struct Point {
    var x = 0.0, y = 0.0
    // 编译时会报错
    func moveBy(x deltaX: Double, y deltaY: Double) {
        //self
        self.x += deltaX 
        self.y += deltaY
    } 
    
}

moveBy由于修改了自身,所以会编译不通过 需要在前面加mutating

struct Point {
    var x = 0.0, y = 0.0
   mutating  func moveBy(x deltaX: Double, y deltaY: Double) {
        self.x += deltaX 
        self.y += deltaY
    } 
    
}

异变方法的本质:对于变异方法, 传入的 self 被标记为 inout 参数。无论在 mutating 方法 内部发生什么,都会影响外部依赖类型的一切

在结构体中:函数默认self是以值类型传入,加了mutating之后self是指针的方式传入

方法的调度

  • OC:使用objc_msgSend
  • swift:找到Metadata,确定函数地址(Metadata + 偏移量),执行函数,基于函数表的调度

方法调度方式

类型            调度方式    extension
值类型          静态派发    静态派发
类              函数表派发  静态派发
NSObject子类    函数表派发  静态派发

静态派发:直调调用函数地址

影响函数派发方式

  • final:添加了final关键字的函数无法被重写,使用静态派发,不会再v-table中出现,且对objc运行时不可见
  • dynamic:函数均可添加dynamic关键字,为非objc类和值类型函数赋予动态性,但派发方式还是函数表派发
  • @objc:该关键字可以将Swift函数暴露给objc运行时,依旧是函数表派发
  • @objc + dynamic:消息派发方式(OC消息传递)

在原swift中是没有runtime的,除非加了@objc

相关文章

  • iOS - swift 类与结构体 方法的派发

    异变方法 Swift 中 class 和 struct 都能定义方法。但是有一点区别的是默认情况 下,值类型属性不...

  • Swift-方法

    在Swift中,类,结构体,枚举,都能定义实例方法。 结构和枚举可以在Swift中定义方法的事实是与C和Objec...

  • 第九章 类和结构体

    c++中,结构体是稍有不同的类,类能做的,结构体也可以; 而swift中,结构体与类有较大区别, 结构体与类的区别...

  • swift方法

    oc中只有类可以定义方法,swift类/结构体/枚举都能定义方法 swift的类型方法类似oc的类方法 实例方法(...

  • Swift(十六)类、结构体、枚举和方法

    在swift当中, 除了类可以定义方法, 结构体和枚举也可以定义方法, 这是Swift 与 C/Objective...

  • Swift Tour Learn (六) -- Swift 语法

    Swift语法基础(五)-- (类和结构体、属性、方法) 本章将会介绍 类和结构体对比结构体和枚举是值类型类是引用...

  • 最新iOS开发常见面试题总结一!(附答案)

    1.iOS 类(class)和结构体(struct)有什么区别? Swift 中,类是引用类型,结构体是值类型。值...

  • Swift基础5(结构体和类)

    类与结构体的对比 在 Swift 中类和结构体有很多共同之处 定义属性用来存储值; 定义方法用于提供功能; 定义下...

  • Swift 5.1 (9) - 结构体和类

    级别: ★☆☆☆☆标签:「iOS」「Swift 5.1」「结构体」「类」「mutating」作者: 沐灵洛审校: ...

  • swift 类与结构体

    一、类与结构体的对比 1.在 Swift 中类和结构体有很多共同之处: 定义属性用来存储值; 定义方法用于提供功能...

网友评论

      本文标题:iOS - swift 类与结构体 方法的派发

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