Với giới thiệu open
từ khóa trong Swift 3.0 (What is the 'open' keyword in Swift?).Từ khoá 'mở' và phương pháp/thuộc tính có thể ghi đè mở rộng trong tiện ích mở rộng?
Lưu ý: Được giới hạn ở các tiện ích mở rộng trên NSObject
các lớp có nguồn gốc hoặc @objc
phương pháp/thuộc tính được phân bổ.
Mã Mà kê khai và sử dụng public
(class
) phương pháp/tài sản trong công tác khuyến trên modules/khuôn khổ đã phá vỡ, như public
không còn có nghĩa là 'overridable' bên ngoài xác định mô-đun.
Ví dụ:
public extension UIManagedDocument {
public class func primaryDocumentName() -> String {
return "Document"
}
public class func primaryStoreURL() -> URL {
let documentsURL = FileManager.default.userDocumentsURL
return URL(fileURLWithPath: self.primaryDocumentName(), isDirectory: false, relativeTo: documentsURL)
}
public class func primaryModelName() -> String? {
return "Model"
}
}
- gốc đề nghị (SE-0117) là tập trung vào subclassing và không đề cập đến phần mở rộng.
- Hiện nay phần mở rộng không hỗ trợ
open
từ khóa (bạn không thể viếtopen extension NSObject
cũng nhưopen func Method()
)
Câu hỏi: Có workaround được mở rộng override thể phương pháp cung cấp/tài sản trên modules/khung ?
Đây có phải là thực sự liên quan đến việc mở mới vs chế độ truy cập công cộng? Trừ khi tôi nhầm, bạn không thể ghi đè lên các phương thức được khai báo trong tiện ích mở rộng, không phải trong Swift 2 cũng như trong Swift 3). –
Bạn thích hợp cho các lớp * tinh khiết * nhanh nhưng có thể trên các lớp dẫn xuất NSObject cũng như với các phương thức/thuộc tính được phân bổ '@ objc'. ([Bạn có thể ghi đè giữa các phần mở rộng trong Swift hay không?] (Http://stackoverflow.com/questions/27109006/can-you-override-between-extensions-in-swift-or-not-compiler-seems-confused# 27109202)) – Nocross
Tôi hiểu, cảm ơn. (Có lẽ bạn có thể thêm thông tin đó vào câu hỏi). –