Ch07. 函式
7.1 定義與呼叫函式 假設要輸出小時候每人必須背的九九乘法表,如下表所示: 7.1 定義與呼叫函式 假設要輸出小時候每人必須背的九九乘法表,如下表所示: ************************************************** 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 ************************************************
範例程式 import Foundation func printStar() { for _ in 1...50 { print("*", terminator: "") } print(" ") func multiply() { for i in 1...9 { for j in 1...9 { print(String(format: " %4d", (i*j)), terminator: "") printStar() multiply()
7.1.1 函式的參數 上一範例程式輸出50個 *。若要讓使用者決定多少個 * 時,則可 以在呼叫函式printStar給予參數 (parameter),以決定 * 的數目。
範例程式 import Foundation func printStar(starNumber: Int) { for _ in 1...starNumber { print("*", terminator: "") } print("") func multiply() { for i in 1...9 { for j in 1...9 { print(String(format: " %4d", (i*j)), terminator: "") printStar(starNumber: 50) multiply()
7.1.2 函式的回傳值 若函式有回傳值,則必須加以設定回傳值的資料型態。
範例程式 func sum(number: Int) -> Int { var total = 0 for i in 1...number { total += i } return total let i = 100 let tot = sum(number: i) print("1+2+...+\(i) = \(tot)")
輸出結果 1+2+…+100 = 5050
7.1.3 回傳多個值 可使用tuple型態回傳多個值。 tuple是有序的成員集合。
範例程式 // return multiple value func sumAndMean() -> (sum: Int, mean: Int) { let data = [1, 2, 3, 4, 5, 6, 7, 8 ,9, 10] var sum = 0, mean = 0 for i in data { sum += i } mean = (sum) / (data.count) return (sum, mean) let counter = sumAndMean() print("sum = \(counter.sum), mean = \(counter.mean)")
輸出結果 sum = 55, mean = 5
7.2 函式的參數名稱 函式的參數名稱在 Swift有一些變革,如參數有區域與外部參數名 稱之分、預設參數值、可變的參數個數,以及inout參數。
7.2.1 外部參數名稱 一般函式的參數名稱基本是屬於區域參數名稱 (local parameter name) 。
範例程式 // function parameter func sum(n1: Int, n2: Int) -> Int { var total = 0 for i in n1...n2 { total += i } return total let calculate = sum(n1: 1, n2: 100) print(calculate)
輸出結果 5050
7.2.2 預設參數值 參數當中可以先預設其值,好比C++ 的多載函式(function overloading) 。 7.2.2 預設參數值 參數當中可以先預設其值,好比C++ 的多載函式(function overloading) 。 預設的參數值一定要從後面的參數開始設定,不可以第一個是預 設參數而第二個參數不是預設。
範例程式 // default parameter value func sum3(from: Int, to: Int = 100) -> Int { var total = 0 for i in 1...to { total += i } return total let calculate4 = sum3(from: 1) print("1加到100的和為: ", terminator: "") print(calculate4) let calculate5 = sum3(from: 1, to: 10) print("1加到10的和為: ", terminator: "") print(calculate5)
輸出結果 1加到100的和為: 5050 1加到10的和為: 55
7.2.3 可變的參數個數 若要傳給參數的個數是不定數的話,Swift 提供所謂的可變參數 (variadic parameters),這可讓參數的個數更加的有彈性。
範例程式 // variadic parameters func sum(numbers: Int...) -> Int { var total = 0 for i in numbers { total += i } return total let data1 = sum(numbers: 1, 2, 3, 4, 5) print("data1 = \(data1)") let data2 = sum(numbers: 1, 2, 3) print("data2 = \(data2)")
輸出結果 data1 = 15 data2 = 6
7.2.4 參數的型態 參數型態可分為常數 (constant)、變數 (variable) 與inout型態。 7.2.4 參數的型態 參數型態可分為常數 (constant)、變數 (variable) 與inout型態。 前面所談的參數型態皆為常數型態 。 變數型態的參數則可以在函式內更改,這少掉在函式要再宣告另 一變數的好處。
範例程式 // parameter type func left(str: String, count: Int, repChar: Character) -> String { var str = str let amountReplaced = count - str.characters.count for _ in 1 ... amountReplaced { str = str + String(repChar) } return str let originalString = "Swift" let repString = left(str: originalString, count: 12, repChar: "*") print(originalString) print(repString)
輸出結果 Swift Swift*******
7.3 函式型態 函式的型態有許多種,一為無參數也無回傳值型態。 當有參數和回傳值時,就必需加以寫出。
7.3.1 函式型態當做變數的型態 可以將變數的型態宣告為函式的型態,即表示變數將參考到某一 函式 。
範例程式 //有一參數且有回傳值 func evenOrOdd(num: Int) -> Bool { if num % 2 == 0 { return true } else { return false } var evenYesOrNo: (Int) -> Bool = evenOrOdd if evenYesOrNo(5) { print("5 is Even") print("5 is Odd")
輸出結果 5 is Odd
7.3.2 函式型態當做參數的型態 將函式型態當做變數的型態以外,也可以將函式型態當做是函式 的參數型態。
範例程式 func mean(data1: Int, data2: Int) -> Double { return Double(data1+data2) / 2 } func printMean(meanFunction: (Int, Int) -> Double, a: Int, b: Int) { print("(\(a) + \(b)) / 2 is \(meanFunction(a, b))") printMean(meanFunction: mean, a: 8, b: 7)
輸出結果 (8 + 7) / 2 is 7.5
7.3.3 函式型態當做回傳值的型態 func incremental(input: Int) -> Int { 7.3.3 函式型態當做回傳值的型態 func incremental(input: Int) -> Int { return input + 1 } func decremental(input: Int) -> Int { return input - 1 上述定義了兩個函式,分別為incremental和decremental,而且函式 的型態皆為 (Int) -> Int
撰寫一函式chooseFunction,它有一參數increment用以判斷要呼叫incremental或是 decremental函式。 func chooseFunction(increment: Bool) -> (Int)-> Int { if increment { return incremental } else { return decremental }
範例程式 func incremental(input: Int) -> Int { return input + 1 } func decremental(input: Int) -> Int { return input - 1 func chooseFunction(increment: Bool) -> (Int)-> Int { if increment { return incremental } else { return decremental var number = 6 let moveToZero = chooseFunction(increment: number < 0) while number != 0 { print("\(number) ", terminator: "") number = moveToZero(number) print(0) print("end")
輸出結果 6 5 4 3 2 1 0 end
7.4 巢狀函式 若一函式內又包含。其它函式,則稱此函式為巢狀函式 (nested function) 。
範例程式 //nested function func chooseFunction(increment: Bool) -> (Int)-> Int { func incremental(input: Int) -> Int { return input + 1 } func decremental(input: Int) -> Int { return input - 1 if increment { return incremental } else { return decremental
7.5 區域與全域變數 定義在函式內部的變數稱為區域變數(local variable)。 7.5 區域與全域變數 定義在函式內部的變數稱為區域變數(local variable)。 定義在函式外面的變數稱之為全域變數(global variable)。
範例程式 // global or local variable var i = 100 func globalOrLocal() { let i = 200 print("local i = \(i)") } globalOrLocal() print("global i = \(i)")
輸出結果 local i = 200 global i = 100