一. 在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而言,確實是出于對結果的構想(假定就是這樣來推斷后面的結果)
三. 以上是我個人的猜測。如有更好的解釋,請各位多多指教。