2016-12-27 18 views
6

Tôi đã một lớp cơ sở mà thực hiện một phần mở rộng đó phù hợp với một giao thức như sau:phương pháp giao thức ghi đè Swift trong các lớp tiểu

protocol OptionsDelegate { 
    func handleSortAndFilter(opt: Options) 
} 

extension BaseViewController: OptionsDelegate { 
    func handleSortAndFilter(opt: Options) { 
     print("Base class implementation") 
    } 
} 

Tôi đã một lớp con "InspirationsViewController" được thừa kế từ BaseViewController. Và tôi trọng phương pháp giao thức trong phần mở rộng như sau:

extension InspirationsViewController { 
    override func handleSortAndFilter(opt: Options) { 
     print("Inside inspirations") 
    } 
} 

Tôi nhận được lỗi khi tôi ghi đè "handleSortAndFilter" chức năng trong công tác khuyến lớp con: "Declerations trong phần mở rộng không thể ghi đè chưa"

Nhưng tôi không thấy vấn đề tương tự khi tôi triển khai nguồn dữ liệu UITableView và phương thức ủy nhiệm.

Làm cách nào để tránh lỗi này?

+0

'InspirationsViewController' không phải là phân lớp, phần mở rộng của nó. Tôi nghĩ bạn đã định nghĩa sai. Nó phải là một lớp 'InspirationsViewController: BaseViewController' –

+1

@HossamGhareeb mà anh ta đã nói' InspirationsViewController' là lớp con của 'BaseViewController', đây là phần mở rộng cho nó. Vấn đề này có lẽ chưa được thực hiện trong Swift, bạn nên ghi đè lên từ lớp chính, phần mở rộng là để thêm hàm khác – Tj3n

+0

Trong phần mở rộng, chúng ta không thể ghi đè lên các phương thức của lớp siêu. –

Trả lời

7

Sử dụng phần mở rộng giao thức với mệnh đề where. Nó hoạt động.

class BaseViewController: UIViewController { 

} 

extension OptionsDelegate where Self: BaseViewController { 
    func handleSortAndFilter(opt: Options) { 
    print("Base class implementation") 
    } 
} 

extension BaseViewController: OptionsDelegate { 

} 

class InsipartionsViewController: BaseViewController { 

} 

extension OptionsDelegate where Self: InsipartionsViewController { 
    func handleSortAndFilter(opt: Options) { 
    print("Inspirations class implementation") 
    } 
} 
+0

Cảm ơn rất nhiều vì câu trả lời. Bạn có thể vui lòng cung cấp một số giải thích để hiểu việc triển khai không? – Satyam

+0

Biên dịch hoàn hảo. Nhưng chức năng ghi đè không bao giờ gọi của nó được thực hiện trong "InsipartionsViewController". – Satyam

+0

https://talk.objc.io/episodes/S01E29-protocols-class-hierarchies kiểm tra video này về các giao thức và phân cấp lớp nhanh chóng. –

-1

Theo như tôi biết, bạn không thể ghi đè phương thức trong tiện ích. Phần mở rộng chỉ có thể làm như sau: “Extensions trong Swift thể:

  • Thêm thuộc tính ví dụ tính toán và loại thuộc tính tính toán
  • Xác định phương pháp dụ và phương pháp loại
  • Cung cấp initializers mới
  • Xác định subscript
  • Xác định và sử dụng các loại lồng nhau mới
  • Tạo loại hiện có phù hợp với giao thức ”

Trích từ: Apple Inc. “Ngôn ngữ lập trình Swift (Swift 3.0.1).”

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