2014-11-14 3 views
1

일부 도우미 함수를 작성하려고하는데 비슷한 메소드의 '잘못된 재 선언'오류가 발생합니다. 누구나이 방법들이 왜 충돌하는지 설명 할 수 있다면 매우 감사 할 것입니다.Swift에서 함수의 재 선언이 잘못되었습니다.

func CGRectModify(rect: CGRect, x: CGFloat) -> CGRect { 
    return CGRectMake(x, rect.origin.y, rect.size.width, rect.size.height) 
} 

func CGRectModify(rect: CGRect, y: CGFloat) -> CGRect { 
    return CGRectMake(rect.origin.x, y, rect.size.width, rect.size.height) 
} 

func CGRectModify(rect: CGRect, width: CGFloat) -> CGRect { 
    return CGRectMake(rect.origin.x, rect.origin.y, width, rect.size.height) 
} 

func CGRectModify(rect: CGRect, height: CGFloat) -> CGRect { 
    return CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, height) 
} 

두 번째 매개 변수에는 다른 외부 이름이 있기 때문에 메서드에 다른 서명이있는 것으로 인식 될 것입니다. 그것은 그렇지 않습니다.

저는 Apple의 문서를 참조 용으로 사용하고 있지만 Local and External Parameter Names for Methods 섹션에서 대답을 찾을 수 없었습니다. 모든 입력을 많이 주시면 감사하겠습니다.

답변

6

기능에 대한 "자동 외부 매개 변수 이름"규칙은 메소드와 다릅니다.

신속한 적용 규칙은 호출 가능 유형에 따라 다릅니다.

  1. 기능/아니오 "자동 외부 매개 변수 이름은"수행하지

    document → 폐쇄.

    func f(x:Int, y:Int) { /* ... */ } 
    let c = { (x:Int, y:Int) -> Void in /* ... */ } 
    
    f(1, 2) 
    c(1, 2) 
    
  2. 이니셜 → document

    을 "자동 외부 매개 변수 이름은"모든 매개 변수에 대한 기본값입니다.

    class Foo { 
        init(x:Int, y:Int) { /* ... */ } 
    } 
    
    let foo = Foo(x: 1, y: 2) 
    
  3. 방법document

    을 "자동 외부 매개 변수 이름"첫 번째 매개 변수에 대한 제외 . 실종

    extension Foo { 
        func bar(x:Int, y:Int) { /* ... */ } 
    } 
    
    foo.bar(1, y:2) 
    
  4. 첨자 → 문서?

    "자동 외부 매개 변수 이름"이 수행되지 않습니다.

    extension Foo { 
        subscript(x:Int, y:Int) -> Void { 
         get { /* ... */ } 
        } 
    } 
    
    foo[1, 2] 
    

그리고위한 특별한 규칙 ...

  • 기본값은 사용이 기본 동작을 덮어 쓸 수 있습니다 물론

    func fz(x:Int, y:Int, z:Int = 1) { /* ... */ } 
    
    fz(1, 1, z: 1) 
    

:

  • _ name:Type을 : 사용 안 함 "자동 외부 매개 변수 이름"
  • #name:Type : 힘 "자동 외부 매개 변수 이름"
  • externalName internalName:Type : 당신이 언급 된 문서는 방법에 대한,하지 기능입니다
0

실제로 이것은 설명서의 버그처럼 보입니다. 원래 내가 연결된 섹션에서 Local and External Parameter Names for Methods 다음 설명이 작성되었습니다.

func incrementBy(amount: Int, #numberOfTimes: Int) { 
     count += amount * numberOfTimes 
} 

이 그렇지 않은 :

이 기본 동작 효과적으로 당신이 numberOfTimes의 매개 변수 앞에 해시 기호 (#)를 작성했을 경우와 같은 방법을 취급합니다. 두 번째 매개 변수에 해시 기호 (#)를 추가하면 컴파일러 오류가 발생하지 않습니다.

func CGRectModify(rect: CGRect, #height: CGFloat) -> CGRect { 
    return CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, height) 
} 
+2

명시 적 외부 이름. 함수는 다음을 참조하십시오. https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-XID_255 – rintaro

+0

안녕하세요. 이것은 이제 의미가 있습니다. 무리 감사. (당신은 대답을해야합니다) – atreat

관련 문제