簡體   English   中英

在Swift中使用NSCoding協議

[英]Using NSCoding protocol in Swift

我在Swift中實現NSCoding遇到了麻煩。 我構建了以下基本類來演示該問題。 運行此代碼時,出現運行時錯誤,例如:

“ SForwarding:警告:類'_TtC4Projet5Test'的對象0x102801f60沒有實現methodSignatureForSelector:-出現了麻煩”

我已經看到其他示例代碼包括NSObject作為基類,但是我使用的是純粹的Swift實現,並且NSCoding的文檔似乎沒有提到此要求。

任何幫助,將不勝感激!

謝謝。

class Test: NSCoding {
    var array: [String]?

    init() {

    }

    required init(coder decoder: NSCoder!) {
        array = decoder.decodeObjectForKey("array") as? [String]
    }

    func encodeWithCoder(aCoder: NSCoder!) {
        aCoder.encodeObject(self.array, forKey: "array")
    }
}

var myTest = Test()
myTest.array = [String]()
myTest.array!.append("Nick")
NSKeyedArchiver.archiveRootObject(myTest, toFile: "/Users/test/Desktop/test.archive")

問題是Test不是從NSObject派生的。 它需要,否則將(如消息所示)遇到麻煩。

class Test: NSObject, NSCoding {

原因是NSCoding對實例將響應的其他消息做出各種假設,例如methodSignatureForSelector: 非NSObject類不會這樣做。 如果看一下NSObject(和NSObjectProtocol)的文檔,您會發現那里有很多重要的東西,如果不是從NSObject派生的話,您會放棄所有這些東西。

NSCoding的文檔似乎沒有提到此要求

因為NSCoding已經存在20年了,Swift才剛剛出現。 您不能期望文檔中提到這樣的事情。 來自Objective-C可可API的東西顯然期望使用Objective-C可可對象。

如果Swift類不包含'@objc'指令或不從NSObject擴展,則:

  • 將使用static和vtable方法分派。 這速度更快,但是許多可可功能(例如KVO和消息轉發)都需要動態調度。
  • 對象自省將不起作用。

純Swift類的行為有點像C ++,具有令人欽佩的性能,但也有很多剛性。 (但與C ++不同,我們沒有ARC,沒有指針,可選控件,也沒有指針麻煩)。 這構成了引人注目的系統編程語言,也可以在需要性能調整時使用-在通常需要在Cocoa應用程序中使用純C或目標c ++的時候。

同時,可可在很大程度上取決於ObjC運行時的動態性和內省性。 鑒於95%的性能提升是通過調整5%的代碼實現的,因此在Cocoa應用中,建議默認擴展NSObject。 這樣,您的所有可可功能-NSCoding,KVO等將按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM