2015-02-20 14 views
5

Tôi đang cố gắng mở rộng lớp NSDictionary trong Swift để chứa một NSDate được đặt trên init(). Khi tôi thêm init tùy chỉnh của tôi(), tôi nhận được lỗi biên dịch:Không thể ghi đè khởi tạo của NSDictionary trong Swift

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

Tuy nhiên, khi tôi thêm rằng initializer sử dụng tự động hoàn tất, tôi nhận được lỗi sau:

Declarations from extensions cannot be overridden yet

Có cách để ghi đè lên initializer của NSDictionary hoặc Swift có thể không xử lý được chưa?

Đây là lớp học của tôi:

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

Trả lời

4

Swift có một cơ chế mở rộng chính thức cho thêm các phương pháp đến các lớp học, nhưng trình biên dịch đá lên một lỗi khi một lớp con sẽ ghi đè một phương pháp mở rộng. Văn bản lỗi trông hy vọng, mặc dù (nhấn mạnh thêm):

khai báo từ phần mở rộng không thể được ghi đè chưa Đó chính là treo lủng lẳng “chưa” khuyến khích tôi tin rằng các kỹ sư của Apple đang nhận thức được những mẫu thiết kế như phần mở rộng được bảo vệ và sẽ cập nhật Swift để hỗ trợ họ.

Kiểm tra https://github.com/ksm/SwiftInFlux/blob/master/README.md#overriding-declarations-from-extensions

+2

Vì vậy, tôi đoán đó là chưa thể ghi đè lên initializer cho NSDictionary trong Swift. Trình biên dịch yêu cầu bạn ghi đè 'init (dictionaryLiteral :)' nhưng đồng thời không cho phép. Tôi thực sự hy vọng Swift sẽ bổ sung thêm khả năng sớm. – Mel

+0

Apple lameness! –

+0

Vẫn ** không ** cố định với Swift 4. –

Các vấn đề liên quan