2015-02-20 9 views
5

Próbuję rozszerzyć klasy NSDictionary w Swift, aby zawierał NSDate, który jest ustawiony na init(). Kiedy dodać mój własny init(), pojawia się błąd kompilator:Nie można przesłonić inicjalizatora NSDictionary w Swift

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

Kiedy jednak dodać, że inicjator wykorzystaniem autouzupełniania, pojawia się następujący błąd:

Declarations from extensions cannot be overridden yet

Czy istnieje sposób na zastąpienie inicjalizatora NSDictionary lub czy Swift po prostu tego nie obsługuje?

Oto moja klasa:

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") 
    } 
} 

Odpowiedz

4

Swift ma oficjalną mechanizm wewnętrzny dodawania metod do klas, ale kompilator rozpoczyna się błąd, gdy podklasa nadpisuje metodę rozszerzenia. Tekst błędu wygląda nadziei, choć (podkreślenie dodane):

Deklaracje z rozszerzeń nie może być przesłonięta jeszcze To, że zwisające „jeszcze”, który zachęca mnie do przypuszczenia, że ​​inżynierowie Apple są świadomi wzorców projektowych, takich jak chronionego rozszerzeniem wzór i zaktualizuje Swift, aby je wspierać.

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

+2

Więc myślę, że to nie jest jeszcze możliwe, aby zastąpić inicjator dla NSDictionary w Swift. Kompilator wymaga, abyś nadpisał "init (dictionaryLiteral :)", ale jednocześnie na to nie pozwala. Naprawdę mam nadzieję, że Swift wkrótce doda tę możliwość. – Mel

+0

Kulawizna Apple! –

+0

Nadal ** nie ** naprawiono za pomocą Swift 4. –

Powiązane problemy