2015-01-17 15 views
7

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?

+0

„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

+0

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 ". –

+1

Odkrywam pewne pomysły, ale mam przeczucie, że mi się nie uda. :(Jak już powiedzieliśmy, Swift to nie Haskell ... – matt

Odpowiedz

12

Spróbuj:

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

D'oh! Nie mogę uwierzyć, że to było takie proste –

+0

Naprawdę czuję się głupio –

+1

Nie, nie mówiłem ci, że Rintaro by wiedział! – matt

Powiązane problemy