Swift函数重载(证明)

2023-02-13  本文已影响0人  long弟弟

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

真是无语😅

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函数重载

上一篇下一篇

猜你喜欢

热点阅读