Swift語言中為外部引數設定預設值可變引數常量引數變數引數輸入輸出引數

大學霸發表於2015-04-10

Swift語言中為外部引數設定預設值可變引數常量引數變數引數輸入輸出引數

7.4.4  為外部引數設定預設值

開發者也可以對外部引數設定預設值。這時,呼叫的時候,也可以省略引數傳遞本文選自Swift1.2語言快速入門v2.0

【示例7-11】以下的程式碼就為外部引數toStringwithJoiner設定了預設的引數"Swift""---"。程式碼如下:

  • import Foundation

  • func join(string s1: String, toString s2: String="Swift", withJoiner joiner:String="---"){

  •         println("\(s1)\(joiner)\(s2)")

  • }

  • join(string:"Hello")

由於toStringwithJoiner已經設定了預設值,所以呼叫的時候就省略對兩個引數的傳值。執行結果如下所示:

  • Hello---Swift

7.4.5  可變引數

使用可變引數,可以使一個引數接受零個或多個指定型別的值。設定一個可變引數需要在引數型別名後新增“...本文選自Swift1.2語言快速入門v2.0

【示例7-12】下面程式碼使用可變引數計算任意數字的算術平均值。程式碼如下:

  • import Foundation

  • func average(numbers: Double...){

  •     var total: Double = 0

  •     for number in numbers {

  •         total += number

  •     }

  •     println(total/Double(numbers.count))

  • }

  • average(1, 2, 3, 4, 5)

  • average(3, 8, 19)

執行結果如下所示:

  • 3.0

  • 10.0

在使用可變引數時,需要注意以下幾點:

1.只有一個可變引數

在一個函式中,可變引數只可以有一個。否則,就會出現錯誤。如下程式碼:

  • func average(numbers: Double...,aa:Int...){

  •   

  • }

在一個函式中出現了兩個可變引數numberaa,導致程式出現瞭如下的錯誤提示資訊:

  • '...' must be on the last parameter

2.可變引數必須放在最後

可變引數不管在什麼時候都必須放在所有引數之後,即作為最後一個引數。否則,就會出現錯誤,如下程式碼:

  • func average(numbers: Double...,aa:Int){

  •    

  • }

在此程式碼中可變引數numbers放在了aa引數之前,導致程式出現瞭如下的錯誤資訊:

  • '...' must be on the last parameter

7.4.6  常量引數和變數引數

在函式中,引數預設都是常量。如果想要改變一個函式引數的值,會引起程式錯誤。如以下程式碼:

  • func fun(num:Int){

  •     num=num+1

  •     println(num)

  • }

在此程式碼中,函式引數num預設是一個常量,而常量的值是不能改變的,所以導致程式出現如下的錯誤資訊

  • Cannot assign to 'let' value 'num'

如果想要對引數進行修改,必須要使用一個類似於變數的引數,Swift稱之為變數引數。變數引數的定義就是在引數名前使用一個var關鍵字。以下的程式碼就是使用了變數引數實現了字串右對齊的功能。程式碼如下:

  • import Foundation

  • func alignRight(var string: String, cou: Int, pad: String) {

  •     var sc=count(string)

  •     let amountToPad = cou - sc                                                                //獲取輸入"*"的個數

  •    //遍歷

  •    for _ in 1...amountToPad {

  •         string = pad + string

  •     }

  •     println(string)

  • }

  • let originalString1 = "swift"

  • alignRight(originalString1, 10, "*")

  • let originalString2 = "Hi"

  • alignRight(originalString2, 10, "*")

  • let originalString3 = ""

  • alignRight(originalString3, 10, "*")

執行結果如下所示:

  • *****swift

  • ********Hi

  • **********

注意:變數引數只能存在於函式呼叫的生命週期中。

7.4.7  輸入-輸出引數

以上所講的引數只可以在函式本身內改變。例如以下的程式碼,想要實現對ab數值的交換。程式碼如下本文選自Swift1.2語言快速入門v2.0

  • import Foundation

  • func swapTwoInt(var number1: Int, var number2: Int) {

  •     //實現兩個整數的交換

  •     let temp = number1

  •     number1 = number2

  •     number2 = temp

  •     println("函式體內:a=\(number1)")

  •     println("函式體內:b=\(number2)")

  • }

  • var a=2

  • var b=3

  • println("交換前")

  • println("a=\(a)")

  • println("b=\(b)")

  • println("交換後")

  • swapTwoInt(a, b)

  • println("a=\(a)")

  • println("b=\(b)")

執行結果如下所示:

交換前

  • a=2

  • b=3

交換後

  • 函式體內:a=3

  • 函式體內:b=2

  • a=2

  • b=3

在執行結果中可以看到,ab的值可在函式本身內實現了交換。如果開發者想用一個函式來修改引數的值,並且想讓這些變化在函式呼叫後仍然有效。這時,需要定義輸入-輸出引數。它的定義是透過在引數名前加入inout關鍵字。其語法形式如下:

  • func 函式名(inout 引數名資料型別……) {

  •    

  • }

輸入-輸出引數都有一個傳遞給函式的值,將函式修改後,再從函式返回來替換原來的值。其呼叫形式如下:

  • 函式名(&引數……)

其中,引數前面加上&運算子。

【示例7-13】以下的程式碼使用輸入輸出引數實現ab數值的交換功能。程式碼如下:

  • import Foundation

  • func swapTwoInt(inout number1: Int, inout number2: Int) {

  •     //實現兩個整數的交換

  •     let temp = number1

  •     number1 = number2

  •     number2 = temp

  • }

  • var a=2

  • var b=3

  • println("交換前")

  • println("a=\(a)")

  • println("b=\(b)")

  • println("交換後")

  • swapTwoInt(&a, &b)

  • println("a=\(a)")

  • println("b=\(b)")

執行結果如下:

交換前

  • a=2

  • b=3

交換後

  • a=3

  • b=2

注意:如果一個函式的引數是輸入-輸出引數,在呼叫時,必須在引數前加一個“&”符號,否則程式就會出現錯誤。如以下程式碼,在呼叫具有輸入輸出得函式時,在引數前沒有新增“&”符號。程式碼如下:

  • import Foundation

  • func swapTwoInt(inout number1: Int, inout number2: Int) {

  •    ……

  • }

  • var a=2

  • var b=3

  • ……

  • swapTwoInt(a, b)

  • ……

由於在函式,呼叫時沒有在引數前新增“&”符號,導致程式出現了以下的錯誤本文選自Swift1.2語言快速入門v2.0

  • Passing value of type 'Int' to an inout parameter requires explicit '&'

注意:在Swift 1.2中有一個新的屬性“@noescape”可以用在函式中,這意味著這個引數是唯一可被呼叫的(或者用在函式呼叫時以引數的方式出現),其意思是它的生命週期比函式呼叫的週期短,這有助於一些小的效能最佳化本文選自Swift1.2語言快速入門v2.0


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29597077/viewspace-1562247/,如需轉載,請註明出處,否則將追究法律責任。

相關文章