2015-02-20 55 views
5

Sto cercando di estendere la classe NSDictionary in Swift per contenere un NSDate impostato su init(). Quando aggiungo il mio init personalizzato(), ottengo l'errore compilatore:Impossibile sovrascrivere l'inizializzatore di NSDictionary in Swift

'required' initializer 'init(dictionaryLiteral:)' must be provided by subclass of 'NSDictionary'

Tuttavia, quando aggiungo che inizializzatore utilizzando completamento automatico, ottengo il seguente errore:

Declarations from extensions cannot be overridden yet

C'è qualche modo per sovrascrivere l'inizializzatore di NSDictionary o può Swift non gestirlo ancora?

Ecco la mia classe:

class DateParam : NSDictionary { 
    let date : NSDate 

    init(date: NSDate) { 
     super.init() 
     self.date = date 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    required convenience init(dictionaryLiteral elements: (NSCopying, AnyObject)...) { 
     fatalError("init(dictionaryLiteral:) has not been implemented") 
    } 
} 

risposta

4

Swift ha un meccanismo di estensione ufficiale per l'aggiunta di metodi alle classi, ma il compilatore calcia su un errore quando una sottoclasse sovrascrive un metodo di estensione. Il testo di errore sembra promettente, anche se (enfasi aggiunta):

dichiarazioni con estensioni non possono essere ridefinite ancora E 'che penzoloni “ancora”, che mi incoraggia a credere che gli ingegneri di Apple sono a conoscenza dei design pattern, come l'estensione protetta pattern e aggiornerà Swift per supportarli.

check https://github.com/ksm/SwiftInFlux/blob/master/README.md#overriding-declarations-from-extensions

+2

quindi credo che non è ancora possibile eseguire l'override del inizializzatore per NSDictionary a Swift. Il compilatore richiede di eseguire l'override di "init (dictionaryLiteral :)" ma allo stesso tempo non lo consente. Spero davvero che Swift aggiunga presto le sue capacità. – Mel

+0

Zoppia di mela! –

+0

Ancora ** non ** risolto con Swift 4. –