1. 函數(shù)定義
- 無返回值;
func add(a: Int, b: Int) {
return a + b
}
- 有返回值(使用 -> 來定義返回);
func add(a: Int, b: Int) -> Int {
return a + b
}
- 行參默認(rèn)是let,不能為var;
- 隱式返回(只能在swift5.1及以上有效,只有一行代碼,默認(rèn)返回);
func add(a: Int, b: Int) -> Int {
a + b
}
- 返回元組:實(shí)現(xiàn)多值返回;
func calculation(a: Int, b: Int) -> (add: Int, sub: Int, mul: Int) {
return (a+b, a-b, a*b)
}
print(calculation(a: 3, b: 2))
// (add: 5, sub: 1, mul: 6)
2. 函數(shù)文檔注釋
/// 求和【慨述】
/// 將2個(gè)整數(shù)進(jìn)行相加
///
/// - Parameter a: 第一個(gè)整數(shù)
/// - Parameter b: 第二個(gè)整數(shù)
/// - Returens: 兩個(gè)整數(shù)的和
///
/// - Notes: 傳入2個(gè)整數(shù)【批注】
///
func add(a: Int, b: Int) -> Int {
a + b
}
-
按 option + 鼠標(biāo)左鍵,點(diǎn)擊add
3. 參數(shù)標(biāo)簽
- 參數(shù)的標(biāo)簽可以修改;
func add(val1 a: Int, var2 b: Int) -> Int {
a + b
}
add(val1: 1, var2: 2)
- 用下劃線 _ 省略參數(shù)標(biāo)簽;
func add(_ a: Int, _ b: Int) -> Int {
a + b
}
add(1, 2)
4. 設(shè)置參數(shù)默認(rèn)值
func add(a: Int = 0, b: Int) -> Int {
a + b
}
print( add(b: 2) ) // 2
5. 可變參數(shù)
func test(_ nums: Int...) -> Int {
var sum = 0
for num in nums {
sum += num
}
return sum
}
print( test(1, 2, 3, 4) ) // 10
- 一個(gè)函數(shù) 最多只能有1個(gè) 可變參數(shù);
-
緊跟在可變參數(shù)后面的參數(shù),不能省略參數(shù)標(biāo)簽;
6. 輸入輸出參數(shù)
- 使用 inout 定義一個(gè)輸入輸出參數(shù):可以在函數(shù)內(nèi)部修改外部參數(shù)的值;
func swapV(v1: inout Int, v2: inout Int) {
(v2, v1) = (v1, v2)
}
var v1: Int = 10
var v2: Int = 20
swapV(v1: &v1, v2: &v2)
print("v1 = \(v1), v2 = \(v2)") // v1 = 20, v2 = 10
- 可變參數(shù) 不能設(shè)置為 inout;
- inout 參數(shù)不能設(shè)置 默認(rèn)值;
-
inout 參數(shù)只能傳入可以被多次賦值的;
- inout 參數(shù)本質(zhì)是 地址傳遞;
7. 函數(shù)重載
函數(shù)重載的規(guī)則:
- 函數(shù)名相同;
- 參數(shù)個(gè)數(shù)不同、參數(shù)標(biāo)簽不同、參數(shù)類型不同;
func add(a: Int, b: Int) -> Int {
a + b
}
// 參數(shù)個(gè)數(shù)不同
func add(a: Int, b: Int, c: Int) -> Int {
a + b + c
}
// 參數(shù)類型不同
func add(a: Int, b: Double) -> Int {
a + Int(b)
}
// 參數(shù)標(biāo)簽不同
func add(v1: Int, _ v2: Int) -> Int {
v1 + v2
}
- 返回值類型 與函數(shù)重載無關(guān);
8. 內(nèi)聯(lián)函數(shù)
- 如果開啟了編譯器優(yōu)化(release模式下,默認(rèn)開啟優(yōu)化),編譯器會(huì)自動(dòng)將某些函數(shù)編程內(nèi)聯(lián)函數(shù);
-
將函數(shù)調(diào)用展開成函數(shù)體;
不會(huì)函數(shù)被自動(dòng)內(nèi)聯(lián):
- 函數(shù)體比較長(zhǎng);
- 包含遞歸調(diào)用;
- 包含動(dòng)態(tài)派發(fā);
- @(inline) 的使用:
- @inline(never) 定義的函數(shù),永遠(yuǎn)不會(huì)被內(nèi)聯(lián)
@inline(never) func test() {
print("aaaa")
}
- 在release模式下,編譯器會(huì)自動(dòng)開啟優(yōu)化,決定哪個(gè)函數(shù)自動(dòng)內(nèi)聯(lián),因此在編寫代碼時(shí)沒有必要使用 @(inline);
9. 函數(shù)類型
- 每一個(gè)函數(shù)都是有類型的,函數(shù)類型由 形式參數(shù)類型、返回值類型 組成;
func test() {} // () -> Void 或者 () -> ()
func add(a: Int, b: Int) -> Int {
a + b
} // (Int, Int) -> Int
// 定義函數(shù)類型變量
var fun:(Int, Int) -> Int = add
fun(2, 4) // 6
- 函數(shù)類型作為 函數(shù)的參數(shù);
func add(a: Int, b: Int) -> Int {
a + b
} // (Int, Int) -> Int
func printAdd(_ add: (Int, Int) -> Int, _ a: Int, _ b: Int) {
let sum = add(a, b)
print(sum) // 30
}
printAdd(add, 10, 20)
- 函數(shù)作為 返回值;
func next(_ input: Int) -> Int {
input + 1
}
func previous(_ input: Int) -> Int {
input - 1
}
func forward(_ forword: Bool) -> (Int) -> Int {
forword ? next : previous
}
print( forward(false)(0) ) // -1
print( forward(true)(0) ) // 1
- 返回值是函數(shù)類型的函數(shù),叫做高階函數(shù);
10. typealias
- typealias 用來給類型起別名;
typealias Byte = Int8
typealias Char = Character
typealias Short = Int16
typealias Long = Int64
typealias Date = (year: Int, month: Int, day:Int)
func printDate(_ date: Date) {
print(date.year)
print(date.month)
print(date.day)
}
printDate((2019, 9, 24))
- Void是空元祖() ;
public typealias Void = ()
11. 嵌套函數(shù)
- 將函數(shù)定義在函數(shù)內(nèi)部;
func forward(_ forword: Bool) -> (Int) -> Int {
func next(_ input: Int) -> Int {
input + 1
}
func previous(_ input: Int) -> Int {
input - 1
}
return forword ? next : previous
}
print( forward(false)(0) ) // -1
print( forward(true)(0) ) // 1



