一. 在swift函数的申明语法中,可以给参数设置默认值,代码如下:
func test(name: String = "") {
print(#function)
}
test() /// 调用一
test(name: "tom") /// 调用二
- 有默认值的函数,可以省略参数的传递 调用一
- 按正常函数调用 调用二
二. 这种函数是怎么实现的呢?
猜测:编译器会对应生成多个函数:
func test(name: String) {
/// -> 相当于1种写法
/// test(name: String)
print(#function)
}
func test(name: String, address: String = "") {
/// -> 相当于2种写法
/// test(name: String)
/// test(name: String, address: String)
print(#function)
}
从上面的函数来看 test(name: String) 就被重复申明了,那么应该报错啊!不不不,我们只能说它可能报错,请看下面的代码,代码比较长,请耐心阅读
/// 同名不同参
func test(name: String) {
/// -> 相当于1种写法
/// test(name: String) -> 和自身行式一样的,假设为特殊,可以覆盖其他(不能被其它覆盖)specialFunc
print(#function)
}
func test(name: String, address: String = "") {
/// -> 相当于2种写法
/// test(name: String)
/// test(name: String, address: String) specialFunc
print(#function)
}
func test(name: String, age: Int = 18) {
/// -> 相当于2种写法
/// test(name: String)
/// test(name: String, age: Int) specialFunc
print(#function)
}
func test(name: String, age: Int = 18, address: String = "") {
/// -> 相当于4种写法
/// test(name: String)
/// test(name: String, age: Int)
/// test(name: String, address: String)
/// test(name: String, age: Int, address: String) specialFunc
print(#function)
}
/// 由于specialFunc的覆盖和唯一性
/// 上面的函数最终得到如下4个(仅有)唯一函数
/// test(name: String) specialFunc
/// test(name: String, address: String) specialFunc
/// test(name: String, age: Int) specialFunc
/// test(name: String, age: Int, address: String) specialFunc
/// 这里的调用一一对应specialFunc函数, 没有歧义,运行正常
test(name: "tom") /// test(name:)
test(name: "tom", address: "") /// test(name:address:)
test(name: "tom", age: 10) /// test(name:age:)
test(name: "tom", age: 10, address: "") /// test(name:age:address:)
func parameter(name: String, address: String = "", age: Int = 18) {
/// -> 相当于4种写法
/// parameter(name: String)
/// parameter(name: String, address: String)
/// parameter(name: String, age: Int)
/// parameter(name: String, address: String, age: Int) specialFunc
print(#function)
}
func parameter(name: String, age: Int = 18, address: String = "") {
/// -> 相当于4种写法
/// parameter(name: String)
/// parameter(name: String, age: Int)
/// parameter(name: String, address: String)
/// parameter(name: String, age: Int, address: String) specialFunc
print(#function)
}
/// 上面的到6个有歧义的函数:
/// parameter(name: String)
/// parameter(name: String, address: String)
/// parameter(name: String, age: Int)
/// 和
/// parameter(name: String)
/// parameter(name: String, age: Int)
/// parameter(name: String, address: String)
/// 无法确认函数的唯一性,无法正确的调用函数,报错!
/// parameter(name: "")
/// parameter(name: "", age: 10)
/// parameter(name: "", address: "")
/// 上面的函数得到两个唯一函数:
/// parameter(name: String, address: String, age: Int) specialFunc
/// parameter(name: String, age: Int, address: String) specialFunc
/// 调用唯一函数,正确
parameter(name: "", address: "", age: 18)
parameter(name: "", age: 18, address: "")
- 如上的代码可以直接运行来校验猜测
- 就specialFunc而言,确实是出于对结果的构想(假定就是这样来推断后面的结果)
三. 以上是我个人的猜测。如有更好的解释,请各位多多指教。
网友评论