使用 NSCoding 创建 class
create a class using NSCoding
在我的第一个项目中,我使用以下代码创建了一个 class:
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")
}
}
您已有答案代码。您的汇率 class 具有三个数据实例:货币、卖出价和买入价。您的示例代码使用了标题和作者。在 Rate 后添加 : NSObject, NSCoding
。将示例代码复制到 class。将所有出现的标题更改为货币,然后复制所有这些行,然后在这些重复行上将货币更改为销售率,并将作者更改为购买率。
试试这个:
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
class现在继承自NSObject
,它必须调用super.init()
- 添加了
NSCoding
协议的实现
在我的第一个项目中,我使用以下代码创建了一个 class:
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")
}
}
您已有答案代码。您的汇率 class 具有三个数据实例:货币、卖出价和买入价。您的示例代码使用了标题和作者。在 Rate 后添加 : NSObject, NSCoding
。将示例代码复制到 class。将所有出现的标题更改为货币,然后复制所有这些行,然后在这些重复行上将货币更改为销售率,并将作者更改为购买率。
试试这个:
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
class现在继承自NSObject
,它必须调用super.init()
- 添加了
NSCoding
协议的实现