級別: ★☆☆☆☆
標簽:「iOS」「Swift 5.1」「函數(shù)」「變量參數(shù)」「函數(shù)類型」「嵌套函數(shù)」
作者: 沐靈洛
審校: QiShare團隊
Functions:函數(shù)
函數(shù)是執(zhí)行特定任務的獨立代碼塊。為函數(shù)指定了一個標識其功能的名稱,此名稱可用于“調用”函數(shù)以在需要時執(zhí)行其任務。Swift中的每個函數(shù)都有一個類型,由函數(shù)的參數(shù)類型和返回類型組成??梢韵馭wift中的任何其他類型一樣使用此類型,這使得將函數(shù)作為參數(shù)傳遞給其他函數(shù)以及從函數(shù)返回函數(shù)變得很容易。函數(shù)也可以在其他函數(shù)中嵌套使用。
定義和調用函數(shù)
- 定義函數(shù):定義函數(shù)的名稱+定義函數(shù)的參數(shù)+定義函數(shù)的返回值。
- 調用函數(shù):使用其名稱調用該函數(shù),傳遞與函數(shù)參數(shù)類型匹配的值。
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
//上述方法也可以寫為
func greetAgain(person: String) -> String {
return "Hello again, " + person + "!"
}
print(greetAgain(person: "Anna")) //<! "Hello again, Anna!"
函數(shù)參數(shù)和返回值
無參函數(shù)
函數(shù)不要求必須定義輸入?yún)?shù)。即使函數(shù)無參,在函數(shù)名稱后仍需要括號。調用函數(shù)時,函數(shù)名后面還會有一對空括號。
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())//<! "hello, world"
有多個參數(shù)的函數(shù)
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return greetAgain(person: person)
} else {
return greet(person: person)
}
}
print(greet(person: "Tim", alreadyGreeted: true))//<! "Hello again, Tim!"
沒有返回值的函數(shù)
函數(shù)不要求必須定義返回值類型。
func greet(person: String) {
print("Hello, \(person)!")
}
greet(person: "Dave") //<! "Hello, Dave!"
沒有定義返回類型的函數(shù)返回Void類型的特殊值。是一個空元組()。
有多個返回值的函數(shù)
使用元組類型作為函數(shù)的返回值類型,同時返回多個函數(shù)值。
//定義
func minMax(array: [Int]) -> (min: Int, max: Int) {
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
//調用
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")//<! min is -6 and max is 109
返回值為可選的元組類型
若函數(shù)返回的元組類型可能為空值時,則可以使用可選的元組返回類型。通過在元組類型的右括號后面放置一個?來編寫一個可選的元組返回類型,例如(Int,Int)?或(String,Int,Bool)?
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
使用可選綁定來檢查minMax(array :)函數(shù)是否返回nil
if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
print("min is \(bounds.min) and max is \(bounds.max)")
}
函數(shù)的參數(shù)標簽和參數(shù)名稱
每個函數(shù)的參數(shù)都有參數(shù)標簽和參數(shù)名稱。調用函數(shù)時使用參數(shù)標簽。參數(shù)名稱用于函數(shù)的實現(xiàn)。默認情況下,函數(shù)的參數(shù)名稱便是其參數(shù)標簽
指定參數(shù)標簽
在參數(shù)名稱前面編寫參數(shù)標簽,用空格分隔:
func someFunction(argumentLabel parameterName: Int) {
}
//調用
someFunction(argumentLabel: 6) // 參數(shù)名稱 parameterName : 6
//方式二,默認情況
func someFunction(parameterName: Int) {
}
someFunction(parameterName: 6)// 參數(shù)名稱 parameterName : 6
省略參數(shù)標簽
如果不想要參數(shù)的參數(shù)標簽,請用下劃線_替換明確的參數(shù)標簽。
func someFunction(_ parameterName: Int) {
}
//調用
someFunction(7)//參數(shù)忽略,parameterName:7
默認參數(shù)值
通過在該參數(shù)的類型之后為參數(shù)賦值來為函數(shù)中的任何參數(shù)定義默認值。如果定義了默認值,則可以在調用函數(shù)時省略該參數(shù)。
func parameterContainDefaultValue(defaulValue1:Int,defaultValue2:Int=12) {
}
//調用,兩者皆可以,
parameterContainDefaultValue(defaulValue1: 12, defaultValue2: 23)
//因為某個參數(shù)值定義了默認值,因而多出下面的方法。
parameterContainDefaultValue(defaulValue1: 12)
變量參數(shù)
函數(shù)中使用可變參數(shù),表示在函數(shù)調用時可以向該參數(shù)傳遞特定類型的不同數(shù)量的參數(shù)值??勺儏?shù)接受零或多個指定類型的值。
可變參數(shù)的表示:通過在參數(shù)的類型名稱后插入...來表示可變參數(shù)。
傳遞給可變參數(shù)的值在函數(shù)體內可用作適當類型的數(shù)組。例如,一個Double ...類型的可變參數(shù)在函數(shù)體內可用作[Double]的常量數(shù)組。一個函數(shù)可能會有多個可變參數(shù)。
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {//!< numbers 作為[Double]類型的數(shù)組存在
total += number
}
return total / Double(numbers.count)
}
//調用
let average = arithmeticMean(1,2,3,4)
print("平均數(shù)\(average)")//!< 平均數(shù)2.5
輸入輸出參數(shù)inout
默認情況下,函數(shù)參數(shù)是常量。如果嘗試從該函數(shù)體內修改函數(shù)參數(shù)的值會導致編譯時錯誤。
如果我們需要在函數(shù)體內修改參數(shù)的值,并且在函數(shù)調用結束后需要使用被修改過的參數(shù)的值。那么我們就需要定義該參數(shù)為輸入輸出參數(shù)。類似C與Object-C中的指針參數(shù)。
輸入輸出參數(shù)表示:通過將inout關鍵字放在參數(shù)類型之前來表示輸入輸出參數(shù)。
注意:只能將變量作為輸入輸出參數(shù)的參數(shù)值進行傳遞,不能傳遞常量或文字值作為參數(shù),因為不能修改常量和文字。當我們將變量名稱作為參數(shù)傳遞給輸入輸出參數(shù)時,可以在變量名稱前面直接放置&符號,以表示它可以由函數(shù)修改。
//根據(jù)內存地址交換兩個整型數(shù)值
func changeTwoIntNumbers(_ a:inout Int,_ b:inout Int) {
let temp = a
a = b
b = temp
}
//使用時需注意不能將類型為'Int'的不可變值作為inout參數(shù)傳遞,否則會報錯
var a = 6
var b = 7
changeTwoIntNumbers(&a, &b)
print("b:\(b),a:\(a)")//!< b:6,a:7
函數(shù)類型
每個函數(shù)都有一個特定的函數(shù)類型,由函數(shù)的參數(shù)類型和返回類型組成。函數(shù)類型不能帶有參數(shù)標簽。
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
func printHelloWorld() {
print("hello, world")
}
上述示例中的函數(shù)類型分別為:(Int, Int) -> Int和() -> Void。
使用函數(shù)類型
我們可以像使用Swift中的任何其他類型一樣使用函數(shù)類型??梢詫⒊A炕蜃兞慷x為函數(shù)類型,并為該變量分配適當?shù)暮瘮?shù)。
var mathFunction:(Int,Int)->Int = addTwoInts
let addValue = mathFunction(a,b)
mathFunction = subTwoInts(_:_:)
let subValue = mathFunction(a,b)
print(subValue)//!< 1
print(addValue)//!< 13
//定義的函數(shù)
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
func subTwoInts(_ a:Int,_ b:Int)-> Int {
return a - b
}
函數(shù)類型作為參數(shù)類型
使用函數(shù)類型如(Int,Int)- > Int作為另一個函數(shù)的參數(shù)類型。
//定義
func mathResultFunction(_ mathCalculate:(Int,Int)->Int,_ a:Int, _ b:Int){
print("函數(shù)計算的結果為:\(mathCalculate(a,b))")
}
//調用
var mathFunction:(Int,Int)->Int = addTwoInts
let addValue = mathFunction(a,b)
mathFunction = subTwoInts(_:_:)
let subValue = mathFunction(a,b)
mathResultFunction(mathFunction, a, b)//!< 函數(shù)計算的結果為:1
mathResultFunction(addTwoInts(a:_:), a, b)//!< 函數(shù)計算的結果為:13
函數(shù)類型作為返回類型
使用函數(shù)類型作為另一個函數(shù)的返回類型。
//以下兩個函數(shù)盡管具有不同的功能,但是都具有相同的函數(shù)類型,
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
//定義返回值類型為函數(shù)類型的函數(shù)
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
//簡單使用一下
var currentValue = 3
//! tempChooseStepFunction:stepBackward
let tempChooseStepFunction = chooseStepFunction(backward: currentValue > 0)
while currentValue > 0 {
currentValue = tempChooseStepFunction(currentValue)
print(currentValue)
}//!< 2 1 0
嵌套函數(shù)
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepBackward(_ input: Int) -> Int {
return input - 1
}
func stepForward(input: Int) -> Int {
return input + 1
}
return backward ? stepBackward : stepForward
}
參考資料:
swift 5.1官方編程指南
推薦文章:
Swift 5.1 (5) - 控制流
Xcode11 新建工程中的SceneDelegate
iOS App啟動優(yōu)化(二)—— 使用“Time Profiler”工具監(jiān)控App的啟動耗時
iOS App啟動優(yōu)化(一)—— 了解App的啟動流程
iOS WKWebView的基本使用
Swift 5.1 (4) - 集合類型