Se un vincolo di tipo generico Swift è un nome di protocollo, posso richiedere che due tipi, vincolati a quel protocollo, siano dello stesso tipo. Ad esempio:come dire "stessa classe" in un generico Swift
protocol Flier {}
struct Bird : Flier {}
struct Insect: Flier {}
func flockTwoTogether<T:Flier>(f1:T, f2:T) {}
La funzione flockTwoTogether
può essere chiamato con un uccello e un uccello o un insetto e un insetto, ma non con un uccello e un insetto. Questa è la limitazione che voglio. Fin qui tutto bene.
Tuttavia, se provo la stessa cosa con un nome di classe, che non funziona:
class Dog {}
class NoisyDog : Dog {}
class WellBehavedDog: Dog {}
func walkTwoTogether<T:Dog>(d1:T, d2:T) {}
Il problema è che posso chiamare walkTwoTogether
con un WellBehavedDog e NoisyDog. Questo è quello che voglio impedire.
Ci sono due domande qui:
C'è un modo per dire che
walkTwoTogether
non può essere chiamato con un WellBehavedDog e NoisyDog?Si tratta di un errore? Chiedo perché se non riesco a usare un generico per dirlo, è difficile capire perché sia utile che un vincolo generico sia un nome di classe, poiché potremmo ottenere lo stesso risultato solo con una funzione normale.
Mi sembra un comportamento previsto? Hai limitato l'opzione facoltativa di tipo Cane. entrambe le sottoclassi sono conformi a quel tipo e nulla nella dichiarazione le vincola. Se ci fosse un modo per fare quello che vuoi mi aspetterei che richieda una clausola 'where', come in' ', ma che lancia anche un errore. –
cmyr
@ cmyr Sì, certo che ci ho provato. Ecco perché ho chiesto se quello che sto facendo non è come farlo, è possibile farlo. :) – matt
Funziona tutto se 'Dog' è un protocollo.I vincoli generici non possono essere applicati ai tipi non di protocollo. * (qualcosa di simile Type Erasure) * – mattt