Swift 函数默认值的猜测

2017-10-25  本文已影响58人  craig_wang

一. 在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: "")

三. 以上是我个人的猜测。如有更好的解释,请各位多多指教。

上一篇 下一篇

猜你喜欢

热点阅读