Swift 1.1語言函式引數的特殊情況本地引數名外部引數名

大學霸發表於2015-03-06

Swift 1.1語言函式引數的特殊情況本地引數名外部引數名

7.4  函式引數的特殊情況

宣告定義有參函式時,為函式的每一個引數都定義了引數名稱。根據引數名定義的形式不同,函式引數包括本地引數和外部引數名兩種本文選自swift入門很簡單。

7.4.1  本地引數名

本地引數名就是定義函式名時,在引數列表中所寫的引數名,它只可以在函式主體內使用。如以下的一個程式碼片段,它定義了一個函式名為fun的函式,在此函式的引數列表中定義的就是本地引數名文選自swift入門很簡單


  • func fun(start:Int,end:Int,str:String){
  •   ……
  • }


在以上的程式碼中,定義的引數名startendstr都是本地引數名。它只可以在函式本身的程式碼中使用,在呼叫時就不可以使用了。

7.4.2  外部引數名

在函式中,如果每一個引數的目的不是很明確或者是含糊不清的,那麼對於其他開發者來說,是很難理解引數的目的。例如下面的程式碼,它是一個具有字串連線功能的函式,程式碼如下文選自swift入門很簡單


  • func join(s1: String, s2: String, s3: String) {
  •     println("\(s1)\(s3)\(s2)")
  • }
  • join("hello","world",",")


對於這麼一個函式來說,引數s1s2s3只知道是三個字串,但是涉及到每一個引數的具體目的,就不是很容易理解了。為了解決這一難題,Swift提供了外部引數名稱。外部引數和本地引數的定義是一樣的。但是如果開發者需要更好的表達引數的功能,需要在定義時使用外部引數名。外部引數名需要寫在本地引數名之前,並使用空格將其分開。它的一般形式如下:


  • func 函式名(外部引數名 本地引數名:資料型別){
  •   ……
  • }


對於外部引數名的函式,呼叫形式如下:


  • 函式名(外部引數名:引數值)


【示例7-7】以下示例為具有字串連線功能的函式定義外部引數。程式碼如下:


  • func join(string s1: String,tostring s2: String, joiner s3: String) {
  •     println("\(s1)\(s3)\(s2)")
  • }
  • join(string: "Hello", tostring: "Swift", joiner: ",")
  • 其中,string、tostring、joiner都是外部引數名。執行結果如下:
  • Hello,Swift
  • Program ended with exit code: 0


這裡需要注意以下三點:

1)呼叫時使用外部引數:如果為引數提供了一個外部引數名後,需要在呼叫該函式的同時使用外部引數名。否則,程式就會提示錯誤。例如下面的具有字串連線功能的函式呼叫程式碼文選自swift入門很簡單


  • join("Hello", "Swift",  ",")


由於在上方的程式碼中沒有使用外部引數名stringtostringjoiner,所以出現了以下的錯誤提示:


  • Missing argument labels 'string:tostring:joiner:' in call


2)引數的順序:使用外部引數名可以很好的讓其他開發者理解各個引數的目的,但是它的呼叫順序也必須要和定義宣告函式時的一致。例如以下程式碼呼叫具有字串連線功能的函式:


  • join(tostring: "Swift",string: "Hello", joiner: ",")


在宣告定義函式時引數的順序為(string,tostring, joiner),而在呼叫時順序為(tostring, string,joiner)。由於順序不一樣,導致程式出現以下的錯誤資訊:


  • Argument 'string' must precede argument 'tostring'


3)外部引數名稱的快速寫法:如果開發者想要為函式的引數提供一個外部引數名,然而本地引數名已經使用了一個合適的名稱,這時就不需要再為該引數寫相同的兩次名稱了。取而代之的是,寫一次名稱,並用一個“#”號作為名稱的字首。它會告訴編譯器,這裡使用該名稱作為本地引數名和外部引數名。其一般的形式如下:


  • func 函式名(#本地引數名:資料型別){
  •   ……
  • }


【示例7-8】以下程式實現字串連線功能,外部引數名的定義使用了“#”號。程式碼如下文選自swift入門很簡單


  • import Foundation
  • func join(#string:String, #tostring: String, #withJoiner:String) {
  •     println("\(string)\(withJoiner)\(tostring)")
  • }
  • join(string: "hello", tostring: "world", withJoiner: ", ")


雖然定義的時候可以使用“#”簡寫,但是呼叫的時候必須寫完整的外部引數名。

7.4.3  設定引數預設值

在定義函式的時候,可以為引數設定預設值。這樣,在呼叫的時候,就不用再傳遞該引數的值。

【示例7-9】以下的程式碼就為startend引數分別定義了預設值05,其功能是輸出05的數值。程式碼如下:


  • import Foundation
  • //宣告定義函式
  • func fun(start:Int=0,end:Int=5){
  •     var i=start
  •     for i;i<=end;++i{
  •         println(i)
  •     }
  • }
  • fun()                                                                  //呼叫


程式碼中,函式fun()呼叫的時候沒有傳遞任何引數值。這是由於定義函式fun()時引數startend都有預設值,所以呼叫的時候就可以不傳遞引數。執行結果如下所示文選自swift入門很簡單


  • 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • Program ended with exit code: 0


注意:在使用預設值是需要注意以下幾點:

1)定義時,將使用預設值的引數放在函式的引數列表的末尾。這確保了呼叫函式時候, 不會因為省略引數值而影響不具備預設值的引數的順序。

2)呼叫時,如果引數的預設值已經被設定,可以省略該引數的傳值。

3)如果開發者設定了預設值,但在呼叫時想要改變預設值,也可以繼續賦值。

【示例7-10】以下程式碼輸出38之間的數值,包括38。程式碼如下:


  • import Foundation
  • func fun(start:Int=0,end:Int=3){
  •     var i=start
  •     for i;i<=end;++i{
  •         println(i)
  •     }
  • }
  • println("使用預設值範圍")
  • fun()
  • println("使用改變後的範圍")
  • fun(start:3,end:8)                                                                               //改變了預設值


在程式碼中,第一次呼叫使用了引數的預設值,第二次呼叫改變了引數的預設值。執行結果如下文選自swift入門很簡單


  • 使用預設值範圍
  • 0
  • 1
  • 2
  • 3
  • 使用改變後的範圍
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • Program ended with exit code: 0


在為引數設定預設值後,Swift會自動為該引數提供了同名的外部引數名。如果呼叫時需要改變預設值,必須使用外部引數,不能直接賦值。否則,就會出現錯誤,如以下的程式碼:


  • fun(3,8)


在此程式碼中,對startend進行了直接賦值,所以導致程式錯誤,其錯誤資訊如下所示文選自swift入門很簡單


  • Missing argument labels 'start:end:' in call


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

相關文章