使用 NSCoding 创建一个类

Posted

技术标签:

【中文标题】使用 NSCoding 创建一个类【英文标题】:create a class using NSCoding 【发布时间】:2015-09-16 19:48:16 【问题描述】:

在我的第一个项目中,我使用以下代码创建了一个类:

import Foundation

class Rate  
    var currency: String!
    var sellRate: String!
    var buyRate: String!

    init (data: NSDictionary) 
        self.currency = getStringFromJSON(data, key:"CurrencyName")
        self.sellRate = getStringFromJSON(data, key:"SellRate")
        self.buyRate = getStringFromJSON(data, key:"BuyRate")
    

    func getStringFromJSON(data: NSDictionary, key: String) -> String 
        if let info = data[key] as? String 
            return info
        
        return ""
    

我正在摸索如何更新代码以使用 NSCoding。我需要使用 NSKeyedArchiver,这就是为什么对象应该符合 NSCoding 协议。

我有在 GitHub 中找到的工作示例,但我仍然无法编写工作代码。示例:

class Book: NSObject, NSCoding 
    var title: String!
    var author: String!

    required convenience init(coder decoder: NSCoder) 
        self.init()

        self.title = decoder.decodeObjectForKey("title") as! String?
        self.author = decoder.decodeObjectForKey("author")as! String?
    

    func encodeWithCoder(coder: NSCoder) 
        coder.encodeObject(self.title, forKey: "title")
        coder.encodeObject(self.author, forKey: "author")
       

【问题讨论】:

请发布您尝试过的内容。你有什么编译/运行时错误? 【参考方案1】:

试试这个:

class Rate : NSObject, NSCoding 
    var currency: String!
    var sellRate: String!
    var buyRate: String!

    init (_ data: NSDictionary) 
        super.init()
        self.currency = getStringFromJSON(data, key:"CurrencyName")
        self.sellRate = getStringFromJSON(data, key:"SellRate")
        self.buyRate = getStringFromJSON(data, key:"BuyRate")
    

    func getStringFromJSON(data: NSDictionary, key: String) -> String 
        if let info = data[key] as? String 
            return info
        
        return ""
    

    // NSCoding protocol implementation
    @objc func encodeWithCoder(coder : NSCoder) 
        coder.encodeObject(self.currency, forKey:"currency")
        coder.encodeObject(self.sellRate, forKey:"sellRate")
        coder.encodeObject(self.buyRate, forKey:"buyRate")
    

    @objc required init(coder aDecoder: NSCoder) 
        self.currency = aDecoder.decodeObjectForKey("currency") as! String
        self.sellRate = aDecoder.decodeObjectForKey("sellRate") as! String
        self.buyRate = aDecoder.decodeObjectForKey("buyRate") as! String
    


// Usage
let dict = [
    "CurrencyName": "USD",
    "SellRate": "1.12",
    "BuyRate": "1.1"
] 

let r1 = Rate(dict)

// Archive it
let data = NSKeyedArchiver.archivedDataWithRootObject(r1)

// Get it back
let r2 = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! Rate
print(r2.currency)
print(r2.sellRate)
print(r2.buyRate)

对原始代码的更改:

    init 中的data 标签是可选的,带有_。 因为你的Rate类现在继承自NSObject,它必须调用super.init() 添加了NSCoding 协议的实现

SwiftStub

【讨论】:

【参考方案2】:

您已经有了答案的代码。您的 Rate 类具有三个数据实例:currency、sellrate 和 buyrate。您的示例代码使用了标题和作者。在 Rate 之后添加: NSObject, NSCoding。将您的示例代码复制到您的课程中。将所有出现的 title 更改为 currency,然后复制所有这些行,然后在这些重复的行上将货币更改为 sellrate,并将作者更改为 buyrate。

【讨论】:

以上是关于使用 NSCoding 创建一个类的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSCoding 创建用户可编辑的 Plist

使用 NSCoding Swift 保存对象时出现异常

iOS-NSCoder 和 NSCoding

Swift,NSCoding 保存类的数组不起作用

Swift 和 NSCoding:对符合类协议的对象数组进行编码

如何编码(使用 NSCoding)没有 rawValue 的枚举?