天天看點

Swift程式設計七(函數)函數

案例代碼下載下傳

函數

Swift中的每個函數都有一個類型,由函數的參數類型和傳回類型組成。像Swift中的任何其他類型一樣使用此類型,這使得将函數作為參數傳遞給其他函數以及從函數傳回函數變得很容易。函數也可以在其他函數中編寫,以在嵌套函數範圍内封裝有用的功能。

定義和調用函數

略……

函數參數标簽和參數名稱

參數标簽

每個函數參數都有參數标簽和參數名稱。調用函數時使用參數标簽; 每個參數都在函數調用時寫入,其前面帶有參數标簽。參數名稱用于函數的實作。預設情況下,參數使用其參數名稱作為其參數标簽。

所有參數必須具有唯一名稱。雖然多個參數可能具有相同的參數标簽,但唯一的參數标簽有助于使您的代碼更具可讀性。

參數名稱前面編寫參數标簽,用空格分隔:

func someFunc(argumentLabel argumentName: Int) {
    print(argumentName)
}
someFunc(argumentLabel: 1)
           

不想要參數的參數标簽,請為該參數編寫下劃線(_)而不是顯式參數标簽:

func otherFunc(_ argumentName1: Int, argumentLabel2 argumentName2: Int) {
    print("\(argumentName1) + \(argumentName2) = \(argumentName1 + argumentName2)")
}
otherFunc(1, argumentLabel2: 2)
           

預設參數

在參數的類型之後為參數指派來為函數中的任何參數定義預設值。如果定義了預設值,則可以在調用函數時省略該參數:

func defaultParameterFunc(argument1: Int = 1, argument2: Int) {
    print("\(argument1) + \(argument2) = \(argument1 + argument2)")
}
defaultParameterFunc(argument2: 3)
defaultParameterFunc(argument1: 2, argument2: 2)
           

可變參數

變參數參數接受具有指定類型的零倍或更多的值。使用可變參數指定在調用函數時可以為參數傳遞不同數量的輸入值。通過在參數的類型名稱後面插入三個句點字元(…)來編寫可變參數。

可變參數的值在函數體内可用作适當類型的數組。函數可以具有至多一個可變參數。

func variadicParameterFunc(nums: Int...) {
    let sum = nums.reduce(0) { (result, num) -> Int in
        return result + num
    }
    print("\(nums) 的和: \(sum)")
}
variadicParameterFunc(nums: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
           

輸入輸出參數

預設情況下,函數參數是常量。嘗試從該函數體内更改函數參數的值會導緻編譯時錯誤。這意味着無法更改參數的值。

通過将inout關鍵字放在參數類型之前來編寫輸入輸出參數。一個輸入輸出參數傳遞進函數的值,可以由函數修改并替換原來的值。

将變量作為輸入輸出參數的參數傳遞。不能傳遞常量或文字值作為參數,因為不能修改常量和文字。當使用輸入輸出參數調用函數時在變量的名稱前直接放置一個&,以訓示該函數可以修改它。

輸入輸出參數不能具有預設值,并且可變參數不能标記為inout。

func inoutFunc(argument1: inout Int, argument2: inout Int) {
    let temp = argument1
    argument1 = argument2
    argument2 = temp
}
var inout1 = 1
var inout2 = 2
inoutFunc(argument1: &inout1, argument2: &inout2)
print("inout1: \(inout1), inout2: \(inout2)")
           

函數類型

每個函數都有一個特定的函數類型,由函數的參數類型和傳回類型組成。形式上表示為:(參數類型) -> 傳回值類型。

使用函數類型

像使用Swift中的任何其他類型一樣使用函數類型。例如,可以将常量或變量定義為函數類型,并為該變量配置設定适當的函數:

func addInts(nums: [Int]) -> Int {
    return nums.reduce(0) { (result, item) -> Int in
        return result + item
    }
}
func multiplyInts(nums: [Int]) -> Int {
    return nums.reduce(1, { (result, item) -> Int in
        return result*item
    })
}
var mathFunc: ([Int]) -> Int = addInts(nums:)
print(mathFunc([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
mathFunc = multiplyInts(nums:)
print(mathFunc([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
           

函數類型作為參數類型

可以使用函數類型,作為另一個函數的參數類型。這使得可以為函數調用者保留函數實作的某些方面,以便在調用函數時提供:

func printMathResult(mathFunc: ([Int]) -> Int, nums: Int...) {
    print("用參數\(nums)執行函數\(mathFunc)的結果是:\(mathFunc(nums))")
}
printMathResult(mathFunc: mathFunc, nums: 1, 2, 3, 4, 5)
           

函數類型作為傳回類型

可以使用函數類型作為另一個函數的傳回類型。通過在傳回函數的傳回箭頭(->)之後立即編寫完整的函數類型來完成此操作:

func chooseFunc(addInts: Bool) -> ([Int]) -> Int {
    return addInts ? addInts(nums: ) : multiplyInts(nums:)
}
print(chooseFunc(addInts: true)([1, 2, 3, 4, 5]))
           

嵌套函數

在函數體内定義的函數稱為嵌套函數,嵌套函數對外界是隐藏的,但它們的封閉函數仍然可以調用它們。封閉函數也可以傳回其嵌套函數,以允許嵌套函數在另一個範圍内使用:

func sumFunc() -> (Int...) -> Int {
    func sumInts(nums: Int...) -> Int {
        return nums.reduce(0) { (result, item) -> Int in
            result + item
        }
    }
    
    return sumInts(nums:)
}
print(sumFunc()(1, 2, 3, 4, 5))