Spójrz na poniższy kod hipotetycznej:Jak mogę ograniczyć protokół Swift do konkretnego typu?
class Stream<S: SequenceType where S.Generator.Element: Character> {
init(_ sequence: S) {}
}
nie kompiluje. Dostaję "S.Generator.Element ograniczony do postaci bez protokołu". To jest bummer, człowieku. Myślałem o dwóch możliwości:
class Stream<S: SequenceType where S.Generator.Element: ExtendedGraphemeClusterLiteralType> {
}
Ograniczenie to działa, ponieważ Character
jest jedyną rzeczą, wiem do wdrożenia tego protokołu. Problem polega na tym, że teraz mam ExtendedGraphemeClusterLiteralType
zamiast Character
, więc jestem zmuszony do rzucenia, z którym mogę żyć.
Inną możliwością jest zdefiniowanie mojego własnego protokołu, np. CharacterType
, i wprowadzenie w nim Character
przez rozszerzenie. (Prawdopodobnie jest to również bezpieczniejsze). Jest to prawdopodobnie podejście, które podejmiemy, ale zastanawiałem się, czy ktoś nie znał tego ograniczenia poza tym?
„Inną możliwością jest po prostu określić mój własny protokół, na przykład CharacterType i mają charakter wdrożenia, że poprzez rozszerzenie”. Właśnie to zamierzałem zasugerować. Testowałem to i działa dobrze. Nie rozumiem, dlaczego postrzegasz to jako "ograniczenie". – matt
Ograniczenia idą, to nie jest straszne. Ale byłoby miło uniknąć rzutu, który teoretycznie mógłby zawieść, nawet jeśli w praktyce to się nigdy nie zdarzy, a ja jestem rozpieszczany przez takie języki, jak Haskell i C#, które dopuszczają takie rzeczy. Na przykład odpowiednik w języku C# będzie oznaczać "IEnumerable". –
Odkrywam pewne pomysły, ale mam przeczucie, że mi się nie uda. :(Jak już powiedzieliśmy, Swift to nie Haskell ... – matt