2015-01-17 3 views
7

는 다음의 가상 코드를 살펴 : Swift 프로토콜을 구체적인 유형으로 제한하려면 어떻게해야합니까?

class Stream<S: SequenceType where S.Generator.Element: Character> { 
    init(_ sequence: S) {} 
} 

컴파일하지 않습니다. "S.Generator.Element 비 프로토콜 형식 문자 제한"가져옵니다. 이건 망친거야. 나는 두 가지 가능성을 생각했습니다 Character 그 프로토콜을 구현하기 위해 내가 알고있는 유일한 방법이기 때문에

class Stream<S: SequenceType where S.Generator.Element: ExtendedGraphemeClusterLiteralType> { 
} 

이 제약 작동합니다. 문제는 이제 Character 대신 ExtendedGraphemeClusterLiteralType이 생겨서 내가 함께 살 수 있다는 것이지요.

다른 가능성은 내 프로토콜 (예 : CharacterType)을 정의하고 Character에 확장을 통해 구현하는 것입니다. (이것은 아마도 더 안전 할 것입니다.) 이것은 실제로 취할 접근 방법 일 수 있지만,이 제한 사항을 제외하고 다른 사람이이 제한 사항을 피할 수있는 방법을 알고 있는지 궁금합니다.

+0

"다른 가능성은 단지 예를 들어, 내 자신의 프로토콜, CharacterType을 정의하고, 문자는 확장을 통해 그것을 구현하는 것입니다." 그것이 제가 제안하려고했던 것입니다. 나는 그것을 테스트하고 잘 작동합니다. 나는 이것을 왜 "한계"라고 생각하는지 이해하지 못합니다. – matt

+0

한계가 있기 때문에, 그것은 끔찍한 것이 아닙니다. 그러나 이론상 실패 할 수도있는 캐스트를 피하는 것이 좋을 것입니다. 실제로 그런 일은 결코 일어나지 않을 것입니다. 그리고 그런 것들을 허용하는 Haskell 및 C#과 같은 언어에 버릇이 있습니다. 예를 들어, C#에서 이에 상응하는 것은'IEnumerable '입니다. –

+1

몇 가지 아이디어를 탐색하고 있지만 성공하지 못한다고 생각합니다. 많은 사람들이 말했듯이 스위프트는 하스켈이 아닙니다 ... – matt

답변

12

시도 :

class Stream<S: SequenceType where S.Generator.Element == Character> { 
//              ^^ 
    init(_ sequence: S) {} 
} 
+0

D' oh! 나는 그것이 간단했다라고 생각할 수 없다. –

+0

나는 실제로 멍청하다고 느낀다. –

+1

아니, 나는 Rintaro가 알 것이라고 말했다. – matt

관련 문제