2014-06-08 4 views
39

는이 같은 기본 매개 변수 다음에 기본이 아닌 매개 변수가 함수가 있다고 가정 해 비 기본 매개 변수 전에 기본 매개 변수 기능 :스위프트 :

내가 그것을 호출하고 기본값을 사용하는 방법을
func f(first:Int = 100, second:Int){} 

첫 번째 매개 변수?

답변

58

현재의 컴파일러는 매개 변수 목록의 중간에 기본 매개 변수를 허용하지 않습니다.

screenshot of Playground

당신이 first 매개 변수의 기본값을 사용하려는 경우이 같은 함수를 호출 할 수 있습니다 :

f(1) 

당신이 first 매개 변수 사용에 대한 새 값을 제공하려는 경우 외부 이름 :

f(first: 3, 1) 

문서 explains 재치 매개 변수 h 기본값은 자동으로 외부 이름으로 지정됩니다.

Swift는 사용자가 직접 외부 이름을 제공하지 않으면 정의한 기본 매개 변수에 대한 자동 외부 이름을 제공합니다. 자동 외부 이름은 코드에서 로컬 이름 앞에 해시 기호를 작성한 것처럼 로컬 이름과 동일합니다.이 클래스의 메소드 인 경우

+1

이 답변은 기술적으로 정확하며 스위프트에서는 이렇게 할 수 있지만 매우 혼란스럽고 피해야합니다. 마지막에 기본 매개 변수를 갖도록 함수를 리펙토링하는 것은 그렇게 많은 작업이 아닙니다. 이 단순한 경우조차도'f (1) '에 대한 호출이 무엇을 의미하는지 완전히 명확하지 않다. [@ Connor의 대답] (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

, 당신은 함수 f 글로벌 인 경우에는 다음과 같이 호출하기 위해 필요한이

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(4) 
f(first: 30, 5) 

이 인쇄 : 스위프트 3에

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

기술적으로 필요한 매개 변수에 레이블이 필요하지 않습니다. – nathan

+0

예. 난 라벨없이 그것을 시도하고 컴파일되지 않습니다. –

+0

내 답변의 스크린 샷을 참조하십시오. – nathan

4

:

이 오류를 올릴 것이다
defaultParameterBefore(2) 

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

error: missing argument for parameter 'y' in call 

유일한 예외는 다음과 같습니다

  • 가 기본 매개 변수 전에 매개 변수가있다;
  • default 매개 변수 다음의 매개 변수는 닫음입니다.
  • 클로저 매개 변수가 마지막 매개 변수입니다.

    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