美文网首页
Swift 函数默认值的猜测

Swift 函数默认值的猜测

作者: craig_wang | 来源:发表于2017-10-25 17:54 被阅读58次

    一. 在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而言,确实是出于对结果的构想(假定就是这样来推断后面的结果)

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

    相关文章

      网友评论

          本文标题:Swift 函数默认值的猜测

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