簡體   English   中英

Swift 3-NSCoding無需從NSObject繼承的煩惱

[英]Swift 3 - NSCoding without the annoyance of inheriting from NSObject

從NSKeyedArchiver崩潰

2016-10-06 17:06:06.713 MessagesExtension[24473:2175316] *** NSForwarding: 
warning: object 0x61800009d740 of class '' does not implement 
methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[MessagesExtension.Model replacementObjectForKeyedArchiver:]

我創建了一個名為Coding的協議,其全部目的是簡化NSCodingNSKeyedArchiver,而無需使用Objective-C。

protocol Coding {
    static var directory: FileManager.SearchPathDirectory { get }
    static var domainMask: FileManager.SearchPathDomainMask { get }

    func encode() -> [String: AnyObject]
    init()
    init?(dict: [String: AnyObject]?)
}

extension Coding {
    static var directory: FileManager.SearchPathDirectory {
        return .documentDirectory
    }

    static var domainMask: FileManager.SearchPathDomainMask {
        return .userDomainMask
    }

    static var directoryURL: String? {
        return NSSearchPathForDirectoriesInDomains(Self.directory, Self.domainMask, true).last?.appending("/")
    }

    func save(to path: String) -> Bool {
        guard let url = Self.directoryURL else { return false }

        return NSKeyedArchiver.archiveRootObject(self.encode() as NSDictionary, toFile: url + path)
    }

    static func create(from path: String) -> Self {
        guard let url = Self.directoryURL,
              let dict = NSKeyedUnarchiver.unarchiveObject(withFile: url + path) as? [String: AnyObject] else { return self.init() }

        return self.init(dict: dict) ?? self.init()
    }
}

假定此協議和擴展名可以簡化NSCoding並允許該協議在Struts上使用。 但是,嘗試保存對象時,我遇到了上述崩潰。

更具體地說,我在

func save(to path: String) -> Bool {
    guard let url = Self.directoryURL else { return false }

    return NSKeyedArchiver.archiveRootObject(self.encode() as NSDictionary, toFile: url + path)
}

我覺得這與NSDictionary有關,但是我不確定如何進行。

有什么建議么??

Foundation歸檔系統( NSCoding和相關類型)是很早以前就在Objective-C中設計並實現的(部分歷史已超過20年),並且期望“對象”是NSObject實例。 試圖使用它對包含非NSObject類對象的對象圖進行編碼根本不現實。 您可能可以簡化它在Swift中的使用,但是您需要確保存檔者認為的所有對象都是NSObject實現NSObject API的必要部分。 由於沒有關於歸檔程序使用哪些部分的文檔,唯一明智的選擇是將NSObject子類化。

我當然可能錯了,但是您沒有向我們展示代碼的相關部分(特別是encode的實現)。

萬一您看不到它,Vishal S撰寫了一篇非常不錯的文章,介紹了可以(當前)將數據保存在結構中的不同方式。

歸檔和取消歸檔Swift結構實例

或正如維沙爾所說的

“ Swift引入了大量的類型安全性。但是,歸檔和取消歸檔總是會丟失對象的類型。在通過支持Swift的所有原理來實現這一目標的更好方法之前,我們應該利用已有的東西。”

當然,(冒犯SO霸主的風險)可能表明Apple Gurus投入了一些精力來開發一種結構(和類型)友好的方式來保存數據(!)。 只是說。

祝協議順利。

暫無
暫無

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

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