Swift 'open' keyword & overridable method/properties in extension?

后端 未结 2 595
伪装坚强ぢ
伪装坚强ぢ 2021-02-08 05:57

With introduction of open keyword in Swift 3.0 (What is the \'open\' keyword in Swift?).

Note: Limited to extensions on NSObject derived classes

2条回答
  •  孤城傲影
    2021-02-08 06:26

    • 'Protocol-oriented' - declare protocol with desired methods/properties then refactor your extension for protocol compliance.
    • 'Traditional' - implement intermediate (abstract) subclass with desired methods/properties.

    Protocol example:

    protocol PrimaryDocument {
        static func primaryDocumentName() -> String
    
        static func primaryStoreURL() -> URL
    
        static func primaryModelName() -> String?
    }
    
    extension UIManagedDocument : PrimaryDocument {
    
        open class func primaryDocumentName() -> String {
            return "Document"
        }
    
        open class func primaryStoreURL() -> URL {
            let documentsURL = FileManager.default.userDocumentsURL
            return URL(fileURLWithPath: self.primaryDocumentName(), isDirectory: false, relativeTo: documentsURL)
        }
    
        open class func primaryModelName() -> String? {
            return "Model"
        }
    
    }
    

提交回复
热议问题