Limitation des classes dérivées de classes génériques en swift
Je suis en train de dériver ma classe de la classe générique:
class foo<T> {}
class bar : foo<Int> {}
Mais ce code ne peut pas compiler avec salle d'erreur:
Classes dérivées de classes génériques doivent également être générique
Comment faire pour éviter cette limitation? Est-il possible?
- Non, il n'est pas possible.
- Afin générique en swift est presque inutilisable
- Pas vrai, il n'a tout simplement pas la même conception de génériques dans d'autres langues.
- veuillez voir mon "pauvre homme solution à votre problème.
- Je suis d'accord c'est très invalidante.
Vous devez vous connecter pour publier un commentaire.
Ssreg,
Malheureusement, ce n'est officiel:
Laissez-nous espérer qu'Apple corrige cela dans une future version.
Attendant, laissez-nous voir cela comme une opportunité à exploiter l'agrégation au lieu de sous-classement.
REMARQUE:
Comme un homme pauvre version de la solution, on peut utiliser
typealias
:De cette façon, le reste du code peut être écrit comme si Apple a déjà fixé la question.
class bar<Int> : foo<Int> {}
l'Int devenir un espace réservé pour le type générique, en remplaçant le réel swift type Int. Cela permet de générer très drôle messages d'erreur lorsque vous essayez d'utiliser l'Int des propriétés à l'intérieur de la classe.. C'est mieux d'utiliser la hpique solution inutilisée de type générique dans la classe enfant, et de lier la classe de base pour le vrai type Int (ou celui de votre choix)Bar<[MyClass]> : Foo<[MyClass]>
il se plaint d'un manque de "identificateur de nom de paramètre générique"class bar<T:Int> : foo<Int> {}
Dans Swift 2 il est possible de sous-classe d'une classe générique:
class Fancy : Base<T>
. C'est pourquoi @Tom van Zummeren la réponse semble correctUne alternative à la
typealias
solution est de prendre de la documentation littéralement:Nous faire sous-classe d'une classe générique, mais d'un autre type que nous n'utilisons pas pour rien.
Je préfère cette approche à l'aide de
typealias
parce que de ne pas polluer l'espace de noms avec un type supplémentaire. Ceci est particulièrement important si le sous-classe (bar
) est destiné à êtrepublic
ouinternal
.Modifier
La documentation ne comprend plus la phrase sur la prescription de génériques sous-classes. J'espère que cela signifie que Apple prévoit de modifier ce, plus tôt que tard.
typealias bar = bar<AnyObject>
neJ'ai eu le même problème et j'ai trouvé une solution!
Maintenant vous pouvez le faire:
Par défaut, ce sera de la Barre type de SomeType. Le seul inconvénient est que vous ne pouvez le faire pour "subclassable' types. Donc, pour
Int
cela ne fonctionnera pas.public final class NonGenericSubclass {}
, puis en appuyant sur l'exemple ci-dessus, je voudrais déclarerBar
comme suit:class Bar<T : NonGenericSubclass> : Foo<Int> { ... }
. De cette façon, je bénéficie de tous les avantages de laFoo
type int, mais je peux toujours initialiser comme siBar
n'étaient pas générique. Aussi, parce queNonGenericSubclass
est déclaréfinal
, il ne peut pas être sous-classé, de sorte que toute la classe de déclaration d'un type générique peut la considérer comme non générique pour toutes fins utiles. Bonne trouvaille!