Si je déclare
public class A: NSObject {
public class X { }
public init?(x: X? = nil) { }
}
tout va bien. Lorsqu'on l'utilise comme let a = A()
l'initialisateur est appelé comme prévu.
Maintenant, j'aimerais avoir la classe imbriquée X
privée, et la version paramétrée de la init
(il faut bien sûr qu'il en soit ainsi). Mais un simple init?()
doit rester accessible au public comme il l'était auparavant. J'écris donc
public class B: NSObject {
private class X { }
private init?(x: X?) { }
public convenience override init?() { self.init(x: nil) }
}
Mais cela donne lieu à une erreur avec le init?()
initialisateur : l'initialisateur défaillant 'init()' ne peut pas remplacer un initialisateur non défaillant avec l'initialisateur surchargé étant le public init()
en NSObject
.
Comment puis-je déclarer efficacement un initialisateur A.init?()
sans le conflit mais pas B.init?()
?
Question bonus : Pourquoi ne suis-je pas autorisé à remplacer un initialisateur non disponible par un initialisateur disponible ? L'inverse est légal : Je peux remplacer un initialisateur défaillant par un initialisateur non défaillant, ce qui nécessite l'utilisation d'une méthode forcée. super.init()!
et introduit donc le risque d'une erreur d'exécution. Pour moi, laisser la sous-classe disposer de l'initialisateur défaillant me semble plus raisonnable, car une extension de fonctionnalité introduit plus de risques d'échec. Mais peut-être que quelque chose m'échappe - toute explication sera la bienvenue.