2016-08-15 12 views
7

Moja klasa: moja klasa pobiera jeden parametr typu, i ma statyczną metodę, która nie korzysta z parametr typu:Czy konieczne jest przekazanie parametru typu do funkcji statycznych w klasie ogólnej?

class GenericClass<T> { 

    static func blub(x: Int) -> Int { 
     return x + 1 
    } 
} 

Mój problem: gdy próbuję użyć funkcji statycznego, mój kod nie kompilacji:

let z: Int = GenericClass.blub(4) // doesn't compile 

mam wymyślić dwa obejścia:

  1. dać GenericClass rodzajem argument - nie ma znaczenia, jaki rodzaj:

    let y: Int = GenericClass<Void>.blub(4) 
    
  2. utworzyć drugą klasę, która nie posiada żadnych parametrów typu, trzymać metody statyczne

Tak więc wiem, jak uruchomić kod, chociaż może nie być to optymalne rozwiązanie. Ale moje pytanie dotyczy tego, dlaczego Swift działa w ten sposób.

Moje pytanie:

Dlaczego nie let y: Int = GenericClass<Void>.blub(4) skompilować?

Należy opracować ponieważ blub jest sposób statyczny, a zatem nie powinny mieć żadnych interakcji z parametrami typu, które są wykorzystywane tylko do przypadkach, a nie metody statyczne lub zmienne. A przynajmniej tego się spodziewałem.

Gdzie ja się mylę? W jaki sposób parametry klas i metody statyczne klasy współdziałają w Swift?

Czy istnieje lepszy sposób rozwiązania tego problemu niż dwa obejścia, których próbowałem?

Zrzut ekranu:

enter image description here

+0

Bardzo interesujący –

+2

Twoje pytanie powinno być „Dlaczego nie' niech oo: Int = GenericClass.blub (4) 'kompilacji nie – OOPer

+2

http://stackoverflow.com/questions/29700989/how-to-add -type-methods-to-generic-types-in-swift – BJHStudios

Odpowiedz

3

GenericClass nie jest konkretny typ w Swift. Nie da się o tym więcej mówić, niż można mówić o typie Array bez podawania jego parametru typu. (Specyficzna cecha, której Swift nie ma, która pozwalałaby na to, nazywa się "typami o wyższym typie").

Metody statyczne są powiązane z typem betonu (GenericClass<T>), a nie z typem wyższego typu (GenericClass). Aby uzyskać dostęp do metod statycznych, musi znać rzeczywisty typ, który chcesz.

Podczas gdy to prawda, nie używasz obecnie parametru typu w tej metodzie klasy, nic nie powstrzyma cię przed tym (lub przed podklasą!). Ponieważ nie masz możliwości obiecania, że ​​T nigdy nie pojawi się w tej metodzie, nie ma sposobu, aby Swift pozwolił ci go zignorować.

3

Można bowiem odwołać parametry typu rodzajowego z metod statycznych. Na przykład:

struct Wrapper<T> { 
    var value: T 

    private init(_ value: T) { 
     self.value = value 
    } 

    static func wrap(_ value: T) -> Wrapper { 
     return Wrapper(value) 
    } 
} 

W tym przypadku parametr rodzajowy można wywnioskować:

let wrapped = Wrapped.wrap(3) // => Wrapped<Int>