Swift函数重载(证明)
本是不打算证明的,有人质疑让他自己去证明
井蛙不可以语于海者,拘于虚也;夏虫不可以语于冰者,笃于时也。
对牛弹琴:一是比喻对蠢人谈论高深的道理;二是讥笑说话的人不看对象。
真是无语😅
Casa Taloyum.png真不想做一个愤怒的程序员。
但是我看了评论真的很生气,一个人不理解也就算了,还有人不明白也算了!
你为啥不证明一下呢?等着别人做饭可以,让别人盛饭也可以,还让人喂啊?
以前觉得看到评论不对的地方修改一下,不明白的地方解释一下...现在觉得自己回复一下都是对自己的侮辱,求你明白?你真的即使是“码农”,前面必须加俩字!
难怪Casa大神的文章需要翻墙才能评论,没有一点门槛就让人评论,简直狗尾续貂!!!
我读《Swift3.0进阶-王巍》读到重载的时候,也是有怀疑的,书上说拥有同样的名字,但是参数或返回值类型不同的多个方法互称为重载方法...
我也认为重载是参数的类型或个数...咋或返回值类型了呢...
紧接着就写个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
*/
先前的文章也有说明
果然是返回值类型不同构成了重载!!!
那为啥还有人说返回值类型与重载无关,说我误导人呢?
我只能说他大概是别的语言转过来的吧,不了解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++中,参数相同仅返回值不同的话编译报错!是不能重载的!
但是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函数重载