Swift 5.1 (6) - 函數

級別: ★☆☆☆☆
標籤:「iOS」「Swift 5.1」「函數」「變量參數」「函數類型」「嵌套函數」
做者: 沐靈洛
審校: QiShare團隊php


Functions:函數

函數是執行特定任務的獨立代碼塊。爲函數指定了一個標識其功能的名稱,此名稱可用於「調用」函數以在須要時執行其任務。Swift中的每一個函數都有一個類型,由函數的參數類型和返回類型組成。能夠像Swift中的任何其餘類型同樣使用此類型,這使得將函數做爲參數傳遞給其餘函數以及從函數返回函數變得很容易。函數也能夠在其餘函數中嵌套使用。git

定義和調用函數

  • 定義函數:定義函數的名稱+定義函數的參數+定義函數的返回值。
  • 調用函數:使用其名稱調用該函數,傳遞與函數參數類型匹配的值。
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!"
複製代碼

函數參數和返回值

無參函數github

函數不要求必須定義輸入參數。即便函數無參,在函數名稱後仍須要括號。調用函數時,函數名後面還會有一對空括號。編程

func sayHelloWorld() -> String {
    return "hello, world"
}
print(sayHelloWorld())//<!  "hello, world"
複製代碼

有多個參數的函數swift

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!"
複製代碼

沒有返回值的函數數組

函數不要求必須定義返回值類型。bash

func greet(person: String) {
    print("Hello, \(person)!")
}
greet(person: "Dave") //<! "Hello, Dave!"
複製代碼

沒有定義返回類型的函數返回Void類型的特殊值。是一個空元組()微信

有多個返回值的函數函數

使用元組類型做爲函數的返回值類型,同時返回多個函數值。工具

//定義
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

複製代碼

返回值爲可選的元組類型

若函數返回的元組類型可能爲空值時,則可使用可選的元組返回類型。經過在元組類型的右括號後面放置一個?來編寫一個可選的元組返回類型,例如(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 :)函數是否返回nil

if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
    print("min is \(bounds.min) and max is \(bounds.max)")
}
複製代碼

函數的參數標籤和參數名稱

每一個函數的參數都有參數標籤和參數名稱。調用函數時使用參數標籤。參數名稱用於函數的實現。默認狀況下,函數的參數名稱即是其參數標籤 指定參數標籤 在參數名稱前面編寫參數標籤,用空格分隔:

func someFunction(argumentLabel parameterName: Int) {
}
//調用
someFunction(argumentLabel: 6) // 參數名稱 parameterName : 6
//方式二,默認狀況
func someFunction(parameterName: Int) {
}
someFunction(parameterName: 6)// 參數名稱 parameterName : 6
複製代碼

省略參數標籤

若是不想要參數的參數標籤,請用下劃線_替換明確的參數標籤。

func someFunction(_ parameterName: Int) { 
}
//調用
someFunction(7)//參數忽略,parameterName:7
複製代碼

默認參數值

經過在該參數的類型以後爲參數賦值來爲函數中的任何參數定義默認值。若是定義了默認值,則能夠在調用函數時省略該參數。

func parameterContainDefaultValue(defaulValue1:Int,defaultValue2:Int=12) {
}
//調用,二者皆能夠,
parameterContainDefaultValue(defaulValue1: 12, defaultValue2: 23)
//由於某個參數值定義了默認值,於是多出下面的方法。
parameterContainDefaultValue(defaulValue1: 12)
複製代碼

變量參數

函數中使用可變參數,表示在函數調用時能夠向該參數傳遞特定類型的不一樣數量的參數值。可變參數接受零或多個指定類型的值。 可變參數的表示:經過在參數的類型名稱後插入...來表示可變參數。 傳遞給可變參數的值在函數體內可用做適當類型的數組。例如,一個Double ...類型的可變參數在函數體內可用做[Double]的常量數組。一個函數可能會有多個可變參數。

func arithmeticMean(_ numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {//!< numbers 做爲[Double]類型的數組存在
        total += number
    }
    return total / Double(numbers.count)
}
//調用
let average = arithmeticMean(1,2,3,4)
print("平均數\(average)")//!< 平均數2.5
複製代碼

輸入輸出參數inout

默認狀況下,函數參數是常量。若是嘗試從該函數體內修改函數參數的值會致使編譯時錯誤。 若是咱們須要在函數體內修改參數的值,而且在函數調用結束後須要使用被修改過的參數的值。那麼咱們就須要定義該參數爲輸入輸出參數。相似C與Object-C中的指針參數。 輸入輸出參數表示:經過將inout關鍵字放在參數類型以前來表示輸入輸出參數。 注意:只能將變量做爲輸入輸出參數的參數值進行傳遞,不能傳遞常量或文字值做爲參數,由於不能修改常量和文字。當咱們將變量名稱做爲參數傳遞給輸入輸出參數時,能夠在變量名稱前面直接放置符號,以表示它能夠由函數修改。

//根據內存地址交換兩個整型數值
func changeTwoIntNumbers(_ a:inout Int,_ b:inout Int) {
    let temp = a
    a = b
    b = temp
}
//使用時需注意不能將類型爲'Int'的不可變值做爲inout參數傳遞,不然會報錯
var a = 6
var b = 7
changeTwoIntNumbers(&a, &b)
print("b:\(b),a:\(a)")//!< b:6,a:7
複製代碼

函數類型

每一個函數都有一個特定的函數類型,由函數的參數類型和返回類型組成。函數類型不能帶有參數標籤。

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func printHelloWorld() {
    print("hello, world")
}
複製代碼

上述示例中的函數類型分別爲:(Int, Int) -> Int() -> Void

使用函數類型

咱們能夠像使用Swift中的任何其餘類型同樣使用函數類型。能夠將常量或變量定義爲函數類型,併爲該變量分配適當的函數。

var mathFunction:(Int,Int)->Int = addTwoInts
let addValue = mathFunction(a,b)
mathFunction = subTwoInts(_:_:)
let subValue = mathFunction(a,b)
print(subValue)//!< 1
print(addValue)//!< 13
//定義的函數
func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func subTwoInts(_ a:Int,_  b:Int)-> Int {
    return a - b
}
複製代碼

函數類型做爲參數類型

使用函數類型如(Int,Int)- > Int做爲另外一個函數的參數類型。

//定義
func mathResultFunction(_ mathCalculate:(Int,Int)->Int,_ a:Int, _ b:Int){
    print("函數計算的結果爲:\(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)//!< 函數計算的結果爲:1
mathResultFunction(addTwoInts(a:_:), a, b)//!< 函數計算的結果爲:13
複製代碼

函數類型做爲返回類型

使用函數類型做爲另外一個函數的返回類型。

//如下兩個函數儘管具備不一樣的功能,可是都具備相同的函數類型,
func stepForward(_ input: Int) -> Int {
    return input + 1
}
func stepBackward(_ input: Int) -> Int {
    return input - 1
}
//定義返回值類型爲函數類型的函數
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
複製代碼

嵌套函數

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官方編程指南


小編微信:可加並拉入《QiShare技術交流羣》。

關注咱們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公衆號)

推薦文章:
Swift 5.1 (5) - 控制流
Xcode11 新建工程中的SceneDelegate
iOS App啓動優化(二)—— 使用「Time Profiler」工具監控App的啓動耗時
iOS App啓動優化(一)—— 瞭解App的啓動流程
iOS WKWebView的基本使用
Swift 5.1 (4) - 集合類型
奇舞週刊

相關文章
相關標籤/搜索