Swift--方法(函數)

來源:互聯網
上載者:User

標籤:注意   default   class   調用   utc   變數   簡單的   fun   first   

方法是執行特殊任務的自包含代碼塊。你可以給方法名字來表示它的功能,而且在需要的時候調用這個名字的方法來執行它的任務。

 

Swift方法的文法表達很靈活,從類似c的沒有參數名的方法到oc複雜的帶有名字和參數的方法。參數在簡單方法的調用中可以提供預設的初始值,也可以傳入一個變數的參數,當方法執行完後可以修改這個參數。

 

每個方法在Swift中都有一個類型,其中包括參數類型和傳回型別。你可以享其他任何在Swift類型一樣使用這些類型,它可以讓方法更容易的為作為另外一個方法的一個參數值,從方法的傳回值擷取傳回值。函數也可以寫在其他的函數中,以便在嵌套的函數範圍內封裝有效功能。

 

1.函數的聲明與調用

當你定義一個函數的時候,你可能定義一個或者多個名字,函數的傳入值的類型稱為參數。你也可以選擇定義一個方法執行後可能傳回值的類行,稱為傳回值。

 

每個函數的名字最好能描述出它的功能。使用函數的時候,調用這個函數的名字並出入一個輸入值(及我們所稱的參數),這個參數的類型要與這個函數的參數類型一致。函數的參數必須始終以與函數的參數列表相同的順序提供。

 

下面的例子定義了一個greet(person:),該函數輸入一個人的名字,返回一個對這個人的問候字串。為了實現這個例子,可以定義輸入的參數,參數名為person、類型為String;以及返回一個String類型的傳回值。

func greet(person: String) -> String {    let greeting = "Hello, " + person + "!"    return greeting}

 定義一個函數時把所有這些都組合一起,其中首碼用func 關鍵字。你定義函數傳回值時用return的箭頭“->”,後面跟著類型的名字返回。

這個函數的定義描述了它的功能是什麼,接收什麼參數,以及函數執行後返回的參數。這個定義可以讓你在代碼中任何地方更容易清楚的調用。

 

2.函數的參數與傳回值

Swit函數中的參數和傳回值是相當靈活的。你可以用從一個功能函數帶一個沒有命名的參數到 帶有表達函數的參數和不同可選的參數的複雜函數定義一切。

(1)沒有參數的函數

函數不需要定義輸入參數。如下的這個函數沒有帶參數,每次調用該函數的時候,返回相同的字串資訊。

func sayHelloWorld() -> String {    return "hello, world"}print(sayHelloWorld())// Prints "hello, world"

 函數定義的時候仍然需要在函數名後面加上括弧,儘管括弧裡面並沒有參數。當函數調用的時候,函數名後面把空括弧寫上。

(2)函數帶多個參數

函數可以帶有多個輸入參數,寫在括弧內,用“,”號分隔開。

func greet(person: String, alreadyGreeted: Bool) -> String {    if alreadyGreeted {        return greetAgain(person: person)    } else {        return greet(person: person)    }}print(greet(person: "Tim", alreadyGreeted: true))// Prints "Hello again, Tim!"

 (3)函數不帶傳回值

函數不需要定義一個傳回型別。

func greet(person: String) {    print("Hello, \(person)!")}greet(person: "Dave")// Prints "Hello, Dave!"

 因為不需要返回一個值,這個函數在定義的時候不包含返回箭頭(->)或者傳回值。

注意:嚴格的說,greet(person: String)的函數也有傳回值,儘管它的返回並沒有定義。函數沒有定義傳回值的類型時通常返回的是一個特殊類型值Void。它是一個簡單的空元組,可以用“()”表示。

 

調用一個函數的時候,它的傳回值可以忽略。

func printAndCount(string: String) -> Int {    print(string)    return string.count}func printWithoutCounting(string: String) {    let _ = printAndCount(string: string)}printAndCount(string: "hello, world")// prints "hello, world" and returns a value of 12printWithoutCounting(string: "hello, world")// prints "hello, world" but does not return a value

 第一個方法 printAndCount(string:,列印一個字串,然後返回Int類型的字串個數。第二個方法 printWithoutCounting(string:)調用了第一個方法,但是忽略的它的傳回值。當調用第二個函數的時候,第一個函數的資訊依然列印,但是它的傳回值並沒有用到。

(4)函數帶有多個傳回值

你可以用元組的傳回型別作為一個函數的多個傳回值。

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)}

 minMax(array:)這個函數返回一個帶有兩個Int值的元組。

因為元組中的成員值被命名為函數傳回值的一部分,它們可以通過點文法來擷取到最小和最大值。

let bounds = minMax(array: [8, -6, 2, 109, 3, 71])print("min is \(bounds.min) and max is \(bounds.max)")// Prints "min is -6 and max is 109"

 注意:tuple的成員不需要在tuple從函數返回的時候被命名,因為它們的名稱已經被指定為函數的傳回型別的一部分。

 

(5)可選的元組傳回值

如果從函數返回一個元群組類型有可能是一個沒有值的元群組類型,你可以用一個可選的元組傳回型別去表明這個元組可能為nil。你寫一個可選的元組傳回型別通過在元群組類型的括弧外加上一個“?”號,例如: (Int, Int)?或者(String, Int, Bool)?。

注意:一個可選的元群組類型例如(Int,Int)?不同於(Int?,  Int?)。對於可選元群組類型,是整個元群組類型 可選,不是元組內的每一個值可選。

 

為瞭解決空數組的安全,編寫一個minMax(array:)函數,這個函數有一個可選元組傳回值,當數組為空白時,這個傳回值為nil。

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)")}// Prints "min is -6 and max is 109"

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

每個函數的參數都有參數的標籤和參數名稱。參數標籤在函數調用時很有用的。在函數的實現用方法名會用得到。通常,參數用它們的參數名作為它們參數標籤。

func someFunction(firstParameterName: Int, secondParameterName: Int) {    // In the function body, firstParameterName and secondParameterName    // refer to the argument values for the first and second parameters.}someFunction(firstParameterName: 1, secondParameterName: 2)

 所有的參數必須用不一樣的名字。儘管,多個參數可能會有相同的參數標籤,唯一的參數標籤可以協助你的代碼更加易讀。

(1)指定參數標籤

你可以在參數名字面前寫上參數標籤,用 空格分隔開。

func someFunction(argumentLabel parameterName: Int) {    // In the function body, parameterName refers to the argument value    // for that parameter.}

 當下是一個關於greet:(person:)的方法,輸入一個人的名字還有家鄉,返回一個問候語:

func greet(person: String, from hometown: String) -> String {    return "Hello \(person)!  Glad you could visit from \(hometown)."}print(greet(person: "Bill", from: "Cupertino"))// Prints "Hello Bill!  Glad you could visit from Cupertino."

 標籤的使用使得函數像運算式一樣調用,類似於句子,同時還使得函數體更容易解讀、更清晰。

(2)省略參數標籤

如果你的參數不需要參數標籤,用底線代替參數的參數標籤。

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {    // In the function body, firstParameterName and secondParameterName    // refer to the argument values for the first and second parameters.}someFunction(1, secondParameterName: 2)

 如果一個參數有參數標籤,當你調用函數的時候,參數必須被標記。

(3)預設參數值

你可以在函數中為任何的參數定義一個預設的值,通過在參數類型的後面為參數分配一個值。如果你設定了預設的值,當你調用函數的時候,可以省略參數。

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {    // If you omit the second argument when calling this function, then    // the value of parameterWithDefault is 12 inside the function body.}someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault is 6someFunction(parameterWithoutDefault: 4) // parameterWithDefault is 12

 在函數的參數列表開始時,在具有預設值的參數之前,放置沒有預設值的參數。沒有預設值的參數通常對函數的意義更為重要——首先編寫它們使識別相同的函數被調用變得更加容易,無論是否省略了預設參數。

 

Swift--方法(函數)

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.