如何将一组自定义结构保存到 plist swift
Posted
技术标签:
【中文标题】如何将一组自定义结构保存到 plist swift【英文标题】:How to save an array of custom structs to plist swift 【发布时间】:2015-11-10 18:52:52 【问题描述】:我正在尝试将警报数据保存到 plist,它是 alertData 类的数组形式,我能找到的所有信息都指向对其进行编码,然后将其放入数组中,但我我对这是做什么感到困惑?而且我也不知道该怎么做,这是我的游乐场:任何帮助都会很棒
类(我正在尝试保存这些数组)
public class alertData: NSObject, NSCoding
//Properties of the timer data - make optionals optional i.e. alert count etc.
var alertCounter: NSTimeInterval?
var alertText: String?
var alertColor: UIColor?
var alertColorIndex: Int?
//initialisation
init(alertCounter: Double, alertText: String, alertColor: UIColor, alertColourIndex: Int)
self.alertCounter = alertCounter
self.alertText = alertText
self.alertColor = alertColor
self.alertColorIndex = alertColourIndex
public required init(coder aDecoder: NSCoder)
alertCounter = aDecoder.decodeDoubleForKey("Item1")
alertText = aDecoder.decodeObjectForKey("Item2") as? String
alertColor = aDecoder.decodeObjectForKey("Item3") as? UIColor
alertColorIndex = aDecoder.decodeIntegerForKey("Item4")
public func encodeWithCoder(aCoder: NSCoder)
alertCounter = aCoder.decodeDoubleForKey("Item1")
alertText = aCoder.decodeObjectForKey("Item2") as? String
alertColor = aCoder.decodeObjectForKey("Item3") as? UIColor
alertColorIndex = aCoder.decodeIntegerForKey("Item4")
数组(当我在应用程序中添加警报数据时填充):
var alertDataSource: [alertData] = []
并对其进行编码:
let archive = NSKeyedArchiver.archivedDataWithRootObject(self.alertDataSource)
print(archive)
然后提取它:
let result = NSKeyedUnarchiver.unarchiveObjectWithData(archive)
print(result)
提前感谢任何提示/建议
【问题讨论】:
另外,alertArray 是一个 alertData 数组 - 有多个警报 【参考方案1】:您不应该自己打电话给encodeWithCoder()
。使用NSKeyedArchiver
和NSKeyedUnarchiver
。 init(coder:)
和 encodeWithCoder()
将由归档器/取消归档器根据需要调用。
将你的NSCoding
-compliant alertData
实例(这应该是AlertData
,因为类名应该是正确的大小写)放入一个数组(如果你愿意,也可以是字典)并这样做:
let archive = NSKeyedArchiver.archivedDataWithRootObject(yourArrayOfAlertData)
在这种情况下,archive
将是一个 NSData
实例。
更新
其实,我想我第一次错过了,但你的encode...()
方法不对。完全没有。考虑以下差异:
public func encodeWithCoder(aCoder: NSCoder)
aCoder.encodeDouble(alertCounter, forKey:"Item1")
aCoder.encodeObject(alertText, forKey:"Item2")
aCoder.encodeObject(alertColor , forKey:"Item3")
aCoder.encodeInteger(alertColorIndex, forKey:"Item4")
(还可以考虑将密钥命名为与其属性相同,例如 "alertCounter"
代表 alertCounter
。)
【讨论】:
嘿,感谢您的回复和信息,我的警报数据数组看起来像这样 var alertDataSource: [alertData?] = [] 但是当我尝试调用 let archive = NSKeyedArchiver 时,它填充了 alertData .archivedDataWithRootObject(alertDataSource) 我有错误 [alertData?] 不符合预期的类型“AnyObject”,有什么想法吗? 当您最初解压缩它时,您将获得一个 AnyObject 数组。那是因为 NSArray 必须保持一个“通用对象数组”才能与 Cocoa 的其余部分一起工作,而 NSArray 是您从归档器返回的内容。您可以将其转换为更具体的类型。 我还没有弄清楚 - 我使用 let archive = NSKeyedArchiver.archivedDataWithRootObject(self.alertDataSource) print(archive) let result = NSKeyedUnarchiver.unarchiveObjectWithData(archive) print(result) 我得到了错误:NSInvalidArgumentException',原因:'*** -decodeDoubleForKey:仅为抽象类定义。定义 -[NSKeyedArchiver decodeDoubleForKey:]!' 嗨 Joshua,我已经添加了我想做的事情,我认为一旦我设法对其进行编码和解码,将其保存到 plist 就不会成为问题,感谢您的帮助,我已经坚持了好多年了以上是关于如何将一组自定义结构保存到 plist swift的主要内容,如果未能解决你的问题,请参考以下文章