SWIFT 3. Function

SWIFT 3. Function

Single Return value 

func testFunc (count: Int, val: String) -> String {

    return "\(val) = \(count)"

No Return value 

func testFunc (count: Int, val: String)  {

    print("\(val) = \(count)")

Multi-return value

func testFunc (count: Int, val: String) -> (name:String, tel:string) {

    return ("AAA", "12345678")

Arguments

//多參數呼叫方式

func add(a:Int, b:Int) -> Int {

return a+b

}

add(10, b:11) //第二個參數之後, 一定要加參數名

//外部別名, a的外部別名為num1,  b的外部別名為num2

func add(num1 a:Int, num2 b:Int) -> Int {

return a+b

}

add(10, num2:11) //使用外部別名呼叫func 

//忽略外部別名, 使用底線 _

func add(a:Int, _ b:Int, _ c : Int) -> Int {

return a+b+c

}

add(10, 11, 12) //參數一原本就不需要別名

//預設參數值

func add(a:Int, _ b:Int, _ c : Int = 10) -> Int {

return a+b+c

}

add(10, 11, 12)

add(10, 11) //c自動以10帶入

//可變參數, 不能有回傳值, 最多只能有一個可變參數

func spendMoney(val: Int...) {

for vv in val { 

    print("\(vv)")

}

}

spendMoney()

spendMoney(10, 15, 30)

//變數參數 (未指定者為常數參數), 在參數名前加上var

func add(var a: Int, b:Int) ->Int {

    a = a + b

    return a

}

// In-Out參數, 在參數名前加上inout, 呼叫時, 在變數名前要加&

finc addOne(inout a: Int)  {

    a++

}

addOne(&tmp) //tmp++

Func as Type 

//可將一個func視為一個type, 以進行一般性的操作

func add(a: Int, b:Int) -> Int {

return a+b

}

func multiply(a: Int, b:Int) -> Int {

return a+b

}

var myFunc = add  //宣告myFunc為add

var b = myFunc(1,2) // b = 1+2=3

myFunc = multiply //指派myFunc為multiply

b = myFunc(1,2) // b = 1*2=2

//可將func當作另一func的參數

func printFunc(myAct (Int, Int) -> Int, a:Int, b:Int) {

    print("Result = \(myAct(a,b))")

}

printFunc(myFunc, 10, 6) //呼叫printFunc, 並將myFunc傳入, swift只會檢查傳入func的參數是否一致

//可將func做為回傳值

func getFunc(flag:Bool) -> (Int, Int) -> Int {

    return flag? add:multiply

}

let retFunc = getFunc(true)  //Call getFunc to get "add" and assign to retFunc

retFunc(10, 15)  //means to call "add(10, 15)"

//Nested Functions : Func in Func, 無法直接呼叫

func getFunc2(flag:Bool) -> (Int, Int) -> Int {

    func f1(a:Int, b:Int) -> Int {

        return a+b

    }

    func f2(a:Int, b:Int) -> Int {

        return (a+b) *2

    }

    return flag?f1:f2

}

//不能直接呼叫getFunc2內的f1與f2

let retFunc2 = getFunc2(false) //retFunc2會指向getFunc2內f2

let cc = retFunc2(10, 11) //cc = 42

- Felix Lai