2014-09-02 101 views
14

我想擴展框架類(我不想直接編輯源代碼),並使其符合NSCoding添加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)。但是,documentation表示擴展名不能添加新的指定初始值設定項。

我的英文不完美,也許我錯過了一些東西......或者它真的不可能?

回答

10

就像文檔說的那樣,擴展名不能添加新的指定初始值設定項。如果有需要初始化的私有屬性呢?這將不可能正確地初始化類型。您可以在擴展中添加便利初始值設定項,因爲它們的性質必須調用指定的初始值設定項。

此外,init(編碼器aDecoder:NSCoder)被指定爲指定的初始值設定項,因爲它是創建實例的完全不同的路徑。以UIViewController爲例,它可以使用普通代碼創建,也可以從XIB文件創建。

最後,不可能添加實現NSCoding的擴展。

也許你可以創建一個包含這個類的包裝類,並讓它實現NSCoding。