는 다음의 가상 코드를 살펴 : 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
에 확장을 통해 구현하는 것입니다. (이것은 아마도 더 안전 할 것입니다.) 이것은 실제로 취할 접근 방법 일 수 있지만,이 제한 사항을 제외하고 다른 사람이이 제한 사항을 피할 수있는 방법을 알고 있는지 궁금합니다.
"다른 가능성은 단지 예를 들어, 내 자신의 프로토콜, CharacterType을 정의하고, 문자는 확장을 통해 그것을 구현하는 것입니다." 그것이 제가 제안하려고했던 것입니다. 나는 그것을 테스트하고 잘 작동합니다. 나는 이것을 왜 "한계"라고 생각하는지 이해하지 못합니다. – matt
한계가 있기 때문에, 그것은 끔찍한 것이 아닙니다. 그러나 이론상 실패 할 수도있는 캐스트를 피하는 것이 좋을 것입니다. 실제로 그런 일은 결코 일어나지 않을 것입니다. 그리고 그런 것들을 허용하는 Haskell 및 C#과 같은 언어에 버릇이 있습니다. 예를 들어, C#에서 이에 상응하는 것은'IEnumerable'입니다. –
몇 가지 아이디어를 탐색하고 있지만 성공하지 못한다고 생각합니다. 많은 사람들이 말했듯이 스위프트는 하스켈이 아닙니다 ... – matt