2014-12-20 4 views
1

저는 제네릭에 익숙하지 않고 일부 서적을 읽는 동안 이해가되지 않는 것을 발견했습니다. 제네릭 함수에서 type 매개 변수 (함수 이름 바로 다음)를 사용하는 것이 적절한 때는 언제입니까? 언제 부적절한가? 여기일반 매개 변수 절을 사용하는 경우

이 (서명 만, 표준 라이브러리에서) 사용하지 않는 경우의 예 : 여기

func sorted(isOrderedBefore: (T, T) -> Bool) -> Array<T> 

가 사용되는 경우의 예입니다 (내가 읽고 있어요 책에서 가져온) :

func emphasize<T>(inout array:[T], modification:(T) -> T) { 
     for i in 0 ..< array.count { 
      array[i] = modification(array[i]) 
     } 
} 

애플의 신속한 언어 참조 섹션 : 일반적인 매개 변수와 인수를 읽었습니다. 그러나 아직도 나에게는 분명하지 않다. 모든 통찰력에 미리 감사드립니다.

답변

3

첫 번째 예에서 제네릭 매개 변수는 정의 된 유형에서 왔습니다. 나는 이미 제네릭 타입이 T 인 Array 내에서 선언되었다고 생각한다.

두 번째 예제에서 함수 자체가 제네릭 매개 변수를 선언하고 있습니다. 내가 잘못 본 것이 아니라면,이 함수는 전역 함수입니다. 일반 T을 정의하는 범위 내에 있지 않습니다.

새 범용 매개 변수를 이미 범위에 선언 된 함수를 숨기거나 바꾸려고하는 함수에 선언하는 것은 부적절합니다. 어레이를 확장 할 때, 예를 들어,이 부적절한 것 :

extension Array { 
    func myFunc<T>() { 
    } 
} 

여기서는 이미 배열 선언에서 선언 일본어 T을 모호하게하는 새로운 T을 정의한다.

제네릭 형식을 사용하려는 다른 모든 환경에서는 직접 선언해야합니다.

+0

그건 의미가 있습니다. 매우 감사. –