Se io dichiaroSwift: "initializer failable 'init()' non può ignorare un inizializzatore non failable" vs. parametri di default
public class A: NSObject {
public class X { }
public init?(x: X? = nil) { }
}
tutto va bene. Quando lo si utilizza come let a = A()
, l'inizializzatore viene chiamato come previsto.
Ora, mi piacerebbe avere la classe annidata X
privato, e la parametrizzato init
pure (deve essere, ovviamente). Ma un semplice init?()
dovrebbe rimanere disponibile pubblicamente com'era prima. Così scrivo
public class B: NSObject {
private class X { }
private init?(x: X?) { }
public convenience override init?() { self.init(x: nil) }
}
Ma questo dà un errore con la init?()
inizializzatore: initializer 'init()' failable non può escludere un inizializzatore non failable con l'inizializzatore override essere il public init()
in NSObject
.
Come posso effettivamente dichiarare un inizializzatore A.init?()
senza il conflitto ma non B.init?()
?
Domanda bonus: Perché non è possibile sovrascrivere un inizializzatore non disponibile con uno disponibile? L'opposto è legale: riesco a sovrascrivere un inizializzatore disponibile con un non-disponibile, che richiede l'utilizzo di un numero forzato super.init()!
e introduce quindi il rischio di un errore di runtime. Per me, lasciare che la sottoclasse abbia l'inizializzatore utilizzabile è più sensato dal momento che un'estensione della funzionalità introduce maggiori possibilità di errore. Ma forse mi manca qualcosa qui - spiegazione molto apprezzata.
"override" implica un metodo con la stessa firma nella superclasse. Comunque non c'è 'init?' In 'NSObject' – vadian
@vadian: Sì, ma omettendo' override' il messaggio di errore 'la dichiarazione di override richiede una parola chiave 'override', quindi conta comunque come override. Correzione: sta inserendo 'override', dando l'altro errore. Inoltre, ho il permesso di sovrascrivere un init failable con un non-failable, ma non viceversa. – Stefan