Swift 函數(shù)

func的為函數(shù)關(guān)鍵字,->表示 返回類型

func clickOK(name:String) -> Int {        
    print("bbb")
    // 調(diào)用函數(shù)changeName
    changeName(num: 3, age: 12)
    return 2;
}
// 返回 void
func changeName(num:Int, age:Int) {
    let abrag = num + age        
}
  • 使用下劃線_,可省略參數(shù)標(biāo)簽
func sum(_ v1: Int, _ v2: Int) -> Int {
    return v1 + v2;
}
// 調(diào)用函數(shù)
let result = sum(10, 20)
  • 可添加參數(shù)標(biāo)簽方便閱讀
func gotowork(at time: String){
    print("this time is \(time)")
}
gotowork(at: "08:00")   // 



func greet(person: String, from hometown: String) -> String {
    return "Hello \(person)!  Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// 打印“Hello Bill!  Glad you could visit from Cupertino.”
  • 隱式返回
    如果整個(gè)函數(shù)體是一個(gè)單一表達(dá)式,那么函數(shù)會(huì)返回這個(gè)表達(dá)式。
    任何一個(gè)可以被寫成一行 return 語句的函數(shù),都可以忽略 return。
func sum(v1: Int, v2: Int) -> Int {
    v1 + v2
}
sum(v1: 10, v2: 20) 
  • 返回元組:實(shí)現(xiàn)多返回值
func calculate(a : Int, b: Int) -> (sum: Int, subtract: Int, average: Int){
    let v1 = a + b;
    let v2 = a - b;
    let v3 = v1 / 2
        
    return (v1, v2, v3)
}

// 返回 可選類型的元組(可以為空)
// 加上 ? 即可
func minMax(array: [Int]) -> (min: Int, max: Int)? {
    if array.isEmpty { return nil }   // 返回空

    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        ...
    }
    return (currentMin, currentMax)
}
  • 傳參默認(rèn)值
func check(name: String = "Tom", age: Int = 12, job: String ) {
    // do something
}
// 2種調(diào)用方式
check(job: "player")
check(name: "Alex", age: 30, job: "IT")
  • 可變參數(shù)(可以傳0個(gè)或多個(gè)值)

一個(gè)函數(shù) 最多只能有1個(gè)可變參數(shù)
緊跟在可變參數(shù)后面的參數(shù) 不能省略參數(shù)標(biāo)簽

通過在變量類型名后面加入...的方式,來定義可變參數(shù)。

 func sum(_ numbers: Int...) -> Int {
    var total = 0
// 此時(shí)參數(shù)numbers是一個(gè)數(shù)組,元素類型是Int
    for num in numbers {
        total += number
    }
    return total
}
sum(10, 20, 30, 40)  
  • 輸入輸出參數(shù)
    在函數(shù)內(nèi)部,可修改傳參的值,本質(zhì)是指針傳遞

用關(guān)鍵字inout標(biāo)記,調(diào)用時(shí) 傳的是參數(shù)的地址,不能有默認(rèn)值
可變參數(shù)不能標(biāo)記為inout

func swapValues(v1: inout Int, v2: inout Int) {
    let tmp = v1
    v1 = v2
    v2 = tmp
}
var num1 = 10
var num2 = 20
// 調(diào)用函數(shù)
swapValues(v1: &num1, v2: &num2)

函數(shù)重載(Function Overload)

函數(shù)名相同。參數(shù)個(gè)數(shù)不同 || 參數(shù)類型不同 || 參數(shù)標(biāo)簽不同
返回值類型與函數(shù)重載無關(guān)

內(nèi)聯(lián)函數(shù)(Inline Function)

如果開啟了編譯器優(yōu)化(Release模式默認(rèn)會(huì)開啟優(yōu)化),編譯器會(huì)自動(dòng)將某些函數(shù)變成內(nèi)聯(lián)函數(shù)

  • 函數(shù)類型
    由函數(shù)的 形參類型、返回值類型組成
    可將一個(gè)變量定義為 函數(shù)類型

用途:函數(shù)類型變量 可作為函數(shù)的參數(shù)、函數(shù)的返回值

// 無參無返回值的 函數(shù)類型為: () -> Void 或者 () -> ()
func test() { }  

// 有參有返回值的 函數(shù)類型為: (Int, Int) -> Int
func sum(a: Int, b: Int) -> Int { 
 a+b
} 


// 定義一個(gè)函數(shù)變量aafunc,變量值為 某個(gè)同類型的 函數(shù)
var aafunc: (Int, Int) -> Int = sum 

// 調(diào)用時(shí) 不需要參數(shù)標(biāo)簽
aafun(2, 3) // 5,

函數(shù)類型變量,可作為另一個(gè)函數(shù)的 參數(shù)類型:

它不關(guān)心傳入函數(shù)是如何實(shí)現(xiàn)的,只關(guān)心傳入的函數(shù)是不是一個(gè)正確的類型。

// 接著上面的例子
func printMathResult(_ aafunc: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("Result: \(aafunc(a, b))")
}

// 調(diào)用時(shí),傳入一個(gè)函數(shù)
printMathResult(sum, 3, 5)

函數(shù)類型作為返回類型:

// 傳入一個(gè)bool,返回一個(gè)函數(shù)
func chooseStepFunc(backward: Bool) -> (Int, Int) -> Int {
    return backward ? xxxfunc : sum
}
  • 嵌套函數(shù)
    在一個(gè)函數(shù)的代碼塊內(nèi),可以定義一個(gè)函數(shù);
    把函數(shù),定義在另一個(gè)函數(shù)的代碼塊內(nèi)。

默認(rèn)情況下,嵌套函數(shù)是對(duì)外界不可見的,但是可以被它們的外圍函數(shù)(enclosing function)調(diào)用。一個(gè)外圍函數(shù)也可以返回它的某一個(gè)嵌套函數(shù),使得這個(gè)函數(shù)可以在其他域中被使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容