美文网首页
Swift函数重载(证明)

Swift函数重载(证明)

作者: long弟弟 | 来源:发表于2023-02-13 16:50 被阅读0次

    本是不打算证明的,有人质疑让他自己去证明
    井蛙不可以语于海者,拘于虚也;夏虫不可以语于冰者,笃于时也。
    对牛弹琴:一是比喻对蠢人谈论高深的道理;二是讥笑说话的人不看对象。

    真是无语😅

    Casa Taloyum.png

    真不想做一个愤怒的程序员。
    但是我看了评论真的很生气,一个人不理解也就算了,还有人不明白也算了!
    你为啥不证明一下呢?等着别人做饭可以,让别人盛饭也可以,还让人喂啊?

    以前觉得看到评论不对的地方修改一下,不明白的地方解释一下...现在觉得自己回复一下都是对自己的侮辱,求你明白?你真的即使是“码农”,前面必须加俩字!

    难怪Casa大神的文章需要翻墙才能评论,没有一点门槛就让人评论,简直狗尾续貂!!!

    我读《Swift3.0进阶-王巍》读到重载的时候,也是有怀疑的,书上说拥有同样的名字,但是参数或返回值类型不同的多个方法互称为重载方法...

    重载.png

    我也认为重载是参数的类型或个数...咋或返回值类型了呢...
    紧接着就写个Command Line Tool 试试呗

    func sum(v1:Int,v2:Int) -> Int {
        v1+v2
    }
    
    func sum(v1:Int,v2:Int) -> String {
        "\(v1)+\(v2)"
    }
    
    func sum(v1:Int,v2:Int) {
        print("调用此方法")
    }
    
    let result1 : Int = sum(v1: 10, v2: 20)
    let result2 : String = sum(v1: 10, v2: 20)
    let _: Void = sum(v1: 10, v2: 20)
    print(result1)
    print(result2)
    /**
    调用此方法
    30
    10+20
    */
    

    先前的文章也有说明

    image.png

    果然是返回值类型不同构成了重载!!!
    那为啥还有人说返回值类型与重载无关,说我误导人呢?
    我只能说他大概是别的语言转过来的吧,不了解Swift

    但是我这样附加了代码还是证明不了的,对吧?所以还是有人不明白。赖我!真无语!
    思忖再三!
    附上自己的证明过程!
    C++函数重载底层实现原理是C++利用name mangling(命名倾轧)技术。通过更改函数名,区分不同的函数。
    比方说

    int sum(int a, int b) {
        return a + b;
    }
    

    看汇编的时候可能是sum_int_int

    int sum(double a, double b) {
        return int(a + b) + 100;
    }
    

    看汇编的时候可能是sum_double_double

    int sum(int a) {
        return a + 1;
    }
    

    看汇编的时候可能是sum_int
    为啥我说可能是呢?因为Xcode示例代码

    #include <iostream>
    
    int sum(int a, int b) {
        return a + b;
    }
    int sum(int a) {
        return a + 1;
    }
    int sum(double a, double b) {
        return int(a + b) + 100;
    }
    //编译报错
    //Functions that differ only in their return type cannot be overloaded
    //double sum(int a, int b) {
    //    return 3.14;
    //}
    
    int main(int argc, const char * argv[]) {
        int a = sum(1, 2);
        int b = sum(9);
        int c = sum(3.14, 2.5);
        printf("%d %d %d\n", a, b, c);
        return 0;
    }
    /*
     3 10 105
     */
    

    查看反汇编都是sum,但是call的函数地址是不一样的,我认为是Xcode对C++支持的不太友好!

    C++Disassembly.png

    C++中,参数相同仅返回值不同的话编译报错!是不能重载的!
    但是Swift可以!

    func sum(v1:Int,v2:Int) -> Int {
        v1+v2
    }
    
    func sum(v1:Int,v2:Int) -> String {
        "\(v1)+\(v2)"
    }
    
    func sum(v1:Int,v2:Int) {
        print("调用此方法")
    }
    
    let result1 : Int = sum(v1: 10, v2: 20)
    let result2 : String = sum(v1: 10, v2: 20)
    let _: Void = sum(v1: 10, v2: 20)
    print(result1)
    print(result2)
    /*
    调用此方法
    30
    10+20
    */
    

    查看反汇编代码call的函数地址是不一样的

    Swift-Disassembly.png

    看到了吗?底层原理跟C++的命名倾轧技术类似。

    让它随风去,让它无痕迹,
    所有快乐悲伤所有过去通通都抛去
    心中想的念的盼的望的不会再是Swift函数重载

    相关文章

      网友评论

          本文标题:Swift函数重载(证明)

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