Swift 'open' - Schlüsselwort & überschreibbare Methode/Eigenschaften in der Erweiterung?
Mit der Einführung der open
Schlüsselwort in Swift 3.0 (Was ist die 'open' - Schlüsselwort in Swift?).
Hinweis: Begrenzte Erweiterungen auf NSObject
abgeleitete Klassen oder @objc
zugeschrieben-Methode/Eigenschaften.
Code wich deklariert und verwendet public
(class
) Methoden/Eigenschaften in der Erweiterung über Module/frameworks brach, als public
ist nicht mehr heißt 'overridable' außerhalb des definierenden Moduls.
Beispiel:
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"
}
}
- Ursprünglichen Vorschlag (SE-0117) konzentriert sich auf die Unterklassen und nicht erwähnen extensions.
- Derzeit Erweiterungen nicht unterstützen
open
keyword (kann man nicht schreibenopen extension NSObject
sowieopen func Method()
)
Frage: gibt es Abhilfe, um in der Lage sein, überschreiben Erweiterung Methoden/Eigenschaften über Module/frameworks?
- Ist dies wirklich im Zusammenhang mit der neuen open vs den Zugang der öffentlichkeit Modi? Wenn ich mich nicht Irre, haben Sie nicht außer Kraft setzen kann deklarierten Methoden in extensions sowieso, weder in Swift 2 noch im Swift-3).
- Sie Recht für Reine swift-Klassen, aber man kann auf NSObject abgeleitet Klassen sowie mit
@objc
zugeschrieben Eigenschaften/Methoden. (Können Sie überschreiben Sie zwischen Erweiterungen in Swift oder nicht?) - Ich sehe, danke. (Vielleicht kann man hinzufügen, dass die Informationen zu der Frage).
- Sicherlich tun wird
- Und danke für die Erinnerung mich über meine eigene Antwort 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich mich nicht Irre, haben Sie kann deklarieren Sie die Erweiterung Methoden wie
open
in Ihrem Rahmen, wenn Sie einfach weglassen, diepublic
keywordin der extension-Deklaration:
Und dann (für
NSObject
Unterklassen oder@objc
Mitglieder) können Sie überschreiben die Methodein Ihrer benutzerdefinierten Unterklasse in der Hauptanwendung (oder in einem beliebigen Modul):
public
Wort, als Erweiterung deklariert ist, in einem anderen Modul (gemeinsames framework), und konkrete Unterklasse implementiert wird, ist in der abhängigen Ziel - (app/Erweiterung).extension UIManagedDocument {}
ist in eine Rahmen-undclass MyManagedDocument: UIManagedDocument {}
in der Haupt-app.Protokoll Beispiel: