2014-06-05 21 views
6

W Swift języka programowania widzę przykładSwift wymagać, że dwa leki generyczne są tego samego typu

func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool { 
    for lhsItem in lhs { 
     for rhsItem in rhs { 
      if lhsItem == rhsItem { 
       return true 
      } 
     } 
    } 
    return false 
} 

Wydaje się, że T.GeneratorType.Element == U.GeneratorType.Element oznacza, że ​​elementy generowane kiedy sekwencje są rozkładane akcji ten sam typ bazowy. Więc mogę zrobić

anyCommonElements("123", "1234") 
anyCommonElements([1, 2, 3], [1]) 

ale nie

anyCommonElements("123", [1, 2]) 

Ale T: Sequence, U: Sequence oznacza, że ​​parametry tiu być sekwencje, takie jak String lub tablicą.

Jaki jest właściwy sposób napisania funkcji, która pobiera dwa parametry T i U, które muszą być tego samego typu za pomocą klauzuli where? Pominięcie wymogu T: Sequence, U: Sequence powoduje błąd "GeneratorType nie jest członkiem typu T"

Odpowiedz

5

Jak zauważyłem @conner, ale nigdy nie określiłbyś tego w ten sposób, ponieważ istnieje tylko jeden typ. To jest lepsze:

func functionName<T> (lhs: T, rhs: T) -> Bool { ... } 
1

Jeśli chcesz, aby oba parametry były tego samego typu, możesz użyć tego samego generycznego dla obu. Coś jak:

func functionName <T, T> (lhs: T, rhs: T) -> Bool { 
    return false 
} 
+0

Oh duh, ja się przeliczyłem, że jeden – JuJoDi

Powiązane problemy