2014-06-08 99 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