2014-07-23 10 views
1

신속하게 도우미 기능을 작성하려고하는데보다 편리하게 정렬 할 수 있습니다. 여기에 내가 무엇을해야하고 무엇을 작동합니다 :스위프트 일반 유형 변수가 프로토콜 (유형 클래스)을 준수해야합니다.

someArray.sorted({ someGetter($0) < someGetter($1) }) 

대신 나는 문제는이

func comparing<A,B : Equatable>(f: A -> B) -> ((A,A) -> Bool) { 
    return { f($0) < f($1) } 
} 

같은 비교 함수를 정의하려고했다

someArray.sorted(comparing(someGetter)) 

작성하려합니다, 'B'가 'Equatable'프로토콜을 준수해야한다는 것을 유형 검사자가 알 수 없습니다. 나는 그것을 성취 할 방법을 모른다. 컴파일러는 '\'B \ '가'< '함수로 비교할 두 개의 Ints를 가정하기 때문에'\ 'UInt8 \' '로 변환 할 수 없다고 불평합니다. 내가 가진 예를 들어 '<'을 덮어 쓸 경우

@infix func <(lhs: SomeType, rhs: SomeType) -> Bool { 
    return lhs.i < rhs.i 
} 

다음 컴파일러 대신 UINT8의 SomeType을 가정합니다.

이것은 스위프트로 경기하는 두 번째 날입니다. 내 질문이 너무 바보가 아니길 바래. 나는 아마 다른 실수들도 많이 가질 것이다.

감사합니다.

답변

1

난 당신이 Equatable로 B 필요한 이유를 아주 확실하지 않다 - 당신이 값을 비교하고 있기 때문에, 당신은 단지 그들을 Comparable해야 : 당신이 경우

func comparing<A, B: Comparable >(f: A -> B) -> (A,A) -> Bool { 
    return { f($0) < f($1) } 
} 

이 일치하는 B 필요 EquatableComparable 모두에, 당신은 추가적인 제약 조건을 추가 할 경우 절을 사용할 수 있습니다 :

func comparing<A, B: Comparable where B: Equatable>(f: A -> B) -> (A, A) -> Bool { 
    return { f($0) < f($1) } 
} 
+0

대단히 감사합니다! 네, 그건 틀린 프로토콜이었습니다. 왜 당신은 알 수 있습니까? 왜 Comparable은 <=, > = 및> 만 정의 했는가? 나는 한 언어가 다른 언어에 의해 표현 될 수 있다는 것을 알고있다. Swift가 프로토콜의 메소드에 대한 일부 기본 구현을 지원하는지 알고 있습니까? 또한 Comparable 프로토콜을 필요로하는 정의가있을 수 있었지만 그 중 하나만 찾았습니다. 또한 내 클래스의 SomeType은 이제 Comparable을 구현하지만 추가 구현을 제공 할 필요가 없습니다. '<'- 구현으로 충분할 것 같습니다. 왜 그런지 아십니까? – thetrutz

+0

연산자를 충분히 정의했다면 컴파일러는 다른 연산자를 찾아 낼 수 있습니다. 'SomeType'도'Equatable'을 구현한다고 추측합니다. 맞습니까? 컴파일러가'<'와'=='에 대해 알고 있다면'<=', '> ='및'>'을 단독으로 사용할 수 있습니다. –