2014-09-02 12 views
14

Ich möchte eine Framework-Klasse erweitern (Ich möchte den Quellcode nicht direkt bearbeiten), und es zu NSCoding konform machen.Hinzufügen von NSCoding als Erweiterung

Grundsätzlich ist hier eine Vereinfachung der Situation in der ich bin:

/* Can't be edited. */ 
class Car: NSObject { 
    var color: String? 
} 

/* Can be edited */ 
extension Car: NSCoding { 
    init(coder aDecoder: NSCoder) { 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
    } 
} 

Das Problem wird init(coder aDecoder: NSCoder) ist, gemäß der Header-Datei, ein designated initializer (obwohl das nicht seltsam ist, sollte nicht es ist ein convenience initializer?). Die Erweiterung "documentation" kann jedoch keinen neuen designierten Initialisierer hinzufügen.

Mein Englisch ist nicht perfekt und vielleicht habe ich etwas verpasst ... Oder ist es wirklich unmöglich?

Antwort

10

Wie die Dokumentation sagt, können Erweiterungen keine neuen Initialisierer hinzufügen. Was wäre, wenn es private Eigenschaften gibt, die initialisiert werden müssen? Es wäre unmöglich, den Typ richtig zu initialisieren. Sie können Convenience-Initialisierer in einer Erweiterung hinzufügen, da sie von Natur aus einen bestimmten Initialisierer aufrufen müssen.

Außerdem wird init (Coder aDecoder: NSCoder) als designierter Initialisierer angegeben, weil es eine völlig andere Route zum Erstellen einer Instanz ist. Nehmen Sie zum Beispiel UIViewController, es kann mit einfachem Code erstellt werden oder es kann aus einer XIB-Datei erstellt werden.

Am Ende ist es nicht möglich, eine Erweiterung hinzuzufügen, die NSCoding implementiert.

Vielleicht können Sie eine Wrapper-Klasse erstellen, die diese Klasse enthält und NSCoding implementieren lassen.

Verwandte Themen