Download presentation
Presentation is loading. Please wait.
1
Ch07. 函式
2
7.1 定義與呼叫函式 假設要輸出小時候每人必須背的九九乘法表,如下表所示:
7.1 定義與呼叫函式 假設要輸出小時候每人必須背的九九乘法表,如下表所示: ************************************************** ************************************************
3
範例程式 import Foundation func printStar() { for _ in 1...50 {
print("*", terminator: "") } print(" ") func multiply() { for i in { for j in { print(String(format: " %4d", (i*j)), terminator: "") printStar() multiply()
4
函式的參數 上一範例程式輸出50個 *。若要讓使用者決定多少個 * 時,則可 以在呼叫函式printStar給予參數 (parameter),以決定 * 的數目。
5
範例程式 import Foundation func printStar(starNumber: Int) {
for _ in 1...starNumber { print("*", terminator: "") } print("") func multiply() { for i in { for j in { print(String(format: " %4d", (i*j)), terminator: "") printStar(starNumber: 50) multiply()
6
函式的回傳值 若函式有回傳值,則必須加以設定回傳值的資料型態。
7
範例程式 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(" \(i) = \(tot)")
8
輸出結果 1+2+…+100 = 5050
9
回傳多個值 可使用tuple型態回傳多個值。 tuple是有序的成員集合。
10
範例程式 // 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)")
11
輸出結果 sum = 55, mean = 5
12
7.2 函式的參數名稱 函式的參數名稱在 Swift有一些變革,如參數有區域與外部參數名 稱之分、預設參數值、可變的參數個數,以及inout參數。
13
外部參數名稱 一般函式的參數名稱基本是屬於區域參數名稱 (local parameter name) 。
14
範例程式 // 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)
15
輸出結果 5050
16
7.2.2 預設參數值 參數當中可以先預設其值,好比C++ 的多載函式(function overloading) 。
預設參數值 參數當中可以先預設其值,好比C++ 的多載函式(function overloading) 。 預設的參數值一定要從後面的參數開始設定,不可以第一個是預 設參數而第二個參數不是預設。
17
範例程式 // 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)
18
輸出結果 1加到100的和為: 加到10的和為: 55
19
可變的參數個數 若要傳給參數的個數是不定數的話,Swift 提供所謂的可變參數 (variadic parameters),這可讓參數的個數更加的有彈性。
20
範例程式 // 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)")
21
輸出結果 data1 = 15 data2 = 6
22
7.2.4 參數的型態 參數型態可分為常數 (constant)、變數 (variable) 與inout型態。
參數的型態 參數型態可分為常數 (constant)、變數 (variable) 與inout型態。 前面所談的參數型態皆為常數型態 。 變數型態的參數則可以在函式內更改,這少掉在函式要再宣告另 一變數的好處。
23
範例程式 // parameter type func left(str: String, count: Int, repChar: Character) -> String { var str = str let amountReplaced = count - str.characters.count for _ in amountReplaced { str = str + String(repChar) } return str let originalString = "Swift" let repString = left(str: originalString, count: 12, repChar: "*") print(originalString) print(repString)
24
輸出結果 Swift Swift*******
25
7.3 函式型態 函式的型態有許多種,一為無參數也無回傳值型態。 當有參數和回傳值時,就必需加以寫出。
26
函式型態當做變數的型態 可以將變數的型態宣告為函式的型態,即表示變數將參考到某一 函式 。
27
範例程式 //有一參數且有回傳值 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")
28
輸出結果 5 is Odd
29
函式型態當做參數的型態 將函式型態當做變數的型態以外,也可以將函式型態當做是函式 的參數型態。
30
範例程式 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)
31
輸出結果 (8 + 7) / 2 is 7.5
32
7.3.3 函式型態當做回傳值的型態 func incremental(input: Int) -> Int {
函式型態當做回傳值的型態 func incremental(input: Int) -> Int { return input + 1 } func decremental(input: Int) -> Int { return input - 1 上述定義了兩個函式,分別為incremental和decremental,而且函式 的型態皆為 (Int) -> Int
33
撰寫一函式chooseFunction,它有一參數increment用以判斷要呼叫incremental或是 decremental函式。
func chooseFunction(increment: Bool) -> (Int)-> Int { if increment { return incremental } else { return decremental }
34
範例程式 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")
35
輸出結果 end
36
7.4 巢狀函式 若一函式內又包含。其它函式,則稱此函式為巢狀函式 (nested function) 。
37
範例程式 //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
38
7.5 區域與全域變數 定義在函式內部的變數稱為區域變數(local variable)。
7.5 區域與全域變數 定義在函式內部的變數稱為區域變數(local variable)。 定義在函式外面的變數稱之為全域變數(global variable)。
39
範例程式 // global or local variable var i = 100 func globalOrLocal() { let i = 200 print("local i = \(i)") } globalOrLocal() print("global i = \(i)")
40
輸出結果 local i = 200 global i = 100
Similar presentations