2014-06-08 38 views

回答

58

目前的編譯器允許在參數列表中的默認參數。

screenshot of Playground

你可以這樣調用的函數,如果你想使用的默認值的first參數:

f(1) 

如果你想爲first參數,利用提供了新的價值其外部名稱:

f(first: 3, 1) 

該文檔explains表示參數wit h默認值會自動給出一個外部名稱:

如果您自己沒有提供外部名稱,Swift將爲您定義的任何默認參數提供一個自動外部名稱。自動外部名稱與本地名稱相同,就像您在代碼中的本地名稱之前寫入了散列符號一樣。

+1

儘管這個答案在技術上是正確的,並且你可以在Swift中這樣做,但它很混亂,應該避免。重構函數以在最後使用默認參數並不是那麼有用。即使在這種簡單的情況下,對f(1)的調用意味着什麼也不完全清楚。 [@康納的回答](http://stackoverflow.com/a/24102938/133166)應該是可以接受的。 –

+1

@Rafael我沒有說這是最好的做法;我正確回答了這個問題。因此,這應該是被接受的答案。 – nathan

+1

@Rafael Swift 3'f(1)'會導致錯誤。 – weakish

11

您應該在參數列表的末尾有默認參數。

func f(second:Int, first:Int = 100){} 
f(10) 

將參數與函數的參數 列表的末尾默認值。這可以確保所有對該函數的調用都使用 相同的順序作爲它們的非默認參數,並且清楚地表明 在每種情況下都調用了相同的函數。

Documentation link

+0

所以使用參數有一個默認值那些沒有以前是沒有意義的?爲什麼不是編譯時錯誤? – CarmeloS

+1

不,它不是毫無意義的,它不是「確保所有對該函數的調用都使用相同的順序作爲其非默認參數」。它會工作,但可能會令人困惑。因此,Apple爲開發人員定義了將參數置於默認值的指南。 –

0

如果它是一個類的方法,你需要調用它像這樣

class Test 
{ 
    func f(first:Int = 100, second:Int) 
    { 
     println("first is \(first)") 
     println("second is \(second)") 
    } 

    func other() 
    { 
     f(second: 4) 
     f(first: 30, second: 5) 
     //f(4) will not compile, and neither will f(9,12) 
    } 
} 

如果函數f是全球性的,需要調用它像這樣:

f(4) 
f(first: 30, 5) 

此打印:

first is 100 
second is 4 
first is 30 
second is 5 
+0

從技術上講,您不需要所需參數上的標籤。 – nathan

+0

是的,你可以。我試過沒有標籤,它不會編譯。 –

+0

請參閱我答案中的屏幕截圖。 – nathan

4

在斯威夫特3:

func defaultParameterBefore(_ x: Int = 1, y: Int) {} 

調用

defaultParameterBefore(2) 

將引發此錯誤

error: missing argument for parameter 'y' in call 

唯一的例外是:

  • 有默認的參數之前的參數;
  • and默認參數後面的參數是閉包;
  • and閉包參數是最後一個參數;

    func defaultParameterBetween(_ x: Int, _ y: Bool = true, _ z: String) { 
        if y { 
         print(x) 
        } else 
         z() 
        } 
    } 
    
    // error: missing argument for parameter #3 in call 
    // defaultParameterWithTrailingClosure(1, { print(0) } 
    
    // Trailing closure does work, though. 
    func defaultParameterWithTrailingClosure(_ x: Int, y: Bool = true, 
                _ z:() -> Void) { 
        if y { 
         print(x) 
        } else { 
         z() 
        } 
    } 
    
    defaultParameterWithTrailingClosure(1) { print(0) } 
    

    迅速版

  • 通過後關閉

例如調用DEVELOPMENT-SNAPSHOT-2016-04-12

+2

你的代碼示例不起作用。 z應該是一個閉包'() - > String',而不是'String'? – Binarian

+0

@iGodric對不起,我忘了'defaultParameterWithTrailingClosure'的定義。現在修復。 – weakish

+0

那麼你是說你可以做更長的時間來做類似於被接受的答案,除非它是一個尾隨的閉包? – Honey