如何将一组自定义结构保存到 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()。使用NSKeyedArchiverNSKeyedUnarchiverinit(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的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 中保存一组自定义类

如何创建一组自定义对象(Swift)?

如何从一组自定义字段值中显示 Wordpress 帖子

如何线程安全存档一组自定义对象?

如何在 Core Data 中存储一组自定义(和重复)对象?

从 iCloud 帐户保存和检索 NSArray 的存储库