16

フレームワークのクラスを拡張して (ソースコードを直接編集したくない)、 に準拠させたいNSCoding

基本的に、ここに私がいる状況を単純化したものがあります:

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

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

    func encodeWithCoder(aCoder: NSCoder) {
    }
}

問題はinit(coder aDecoder: NSCoder)、ヘッダー ファイルによると、designated initializer(でも、これは奇妙ではありませんか? である必要はありませんconvenience initializerか? ) です。ただし、ドキュメントには、拡張機能は新しい指定された初期化子を追加できないと書かれています。

私の英語は完璧ではなく、何かを見逃したのかもしれません...それとも本当に不可能なのでしょうか?

4

1 に答える 1

13

ドキュメントにあるように、拡張機能は新しい指定された初期化子を追加できません。初期化が必要なプライベート プロパティがあった場合はどうなるでしょうか。型を適切に初期化することは不可能です。便利な初期化子を拡張機能に追加できます。これは、その性質上、指定された初期化子を呼び出す必要があるためです。

また、 init(coder aDecoder: NSCoder) は、インスタンスを作成するためのまったく別のルートであるため、指定された初期化子として指定されています。たとえば、UIViewController は、プレーン コードを使用して作成することも、XIB ファイルから作成することもできます。

結局、NSCoding を実装する拡張機能を追加することはできません。

おそらく、このクラスを含むラッパー クラスを作成し、NSCoding を実装させることができます。

于 2014-11-09T04:06:55.770 に答える