如何将自定义结构数组保存到 plist swift
How to save an array of custom structs to plist swift
我正在尝试将警报数据保存到 plist,它是以 class 警报数据数组的形式,我能找到的所有信息都指向对其进行编码,然后将其放入阵列,但我对它的作用感到困惑?而且我也不知道该怎么做,这是我的游乐场:任何帮助都会很棒
class(我正在尝试保存这些数组)
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)
提前感谢您的任何提示/建议
您不应该自己给 encodeWithCoder()
打电话。使用 NSKeyedArchiver
和 NSKeyedUnarchiver
。 init(coder:)
和 encodeWithCoder()
将根据归档器/解档器的需要调用。
将符合 NSCoding
的 alertData
实例(这实际上应该是 AlertData
因为 class 名称应该是正确的大小写)放入数组(或字典,如果你请)并执行此操作:
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
。)
我正在尝试将警报数据保存到 plist,它是以 class 警报数据数组的形式,我能找到的所有信息都指向对其进行编码,然后将其放入阵列,但我对它的作用感到困惑?而且我也不知道该怎么做,这是我的游乐场:任何帮助都会很棒
class(我正在尝试保存这些数组)
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)
提前感谢您的任何提示/建议
您不应该自己给 encodeWithCoder()
打电话。使用 NSKeyedArchiver
和 NSKeyedUnarchiver
。 init(coder:)
和 encodeWithCoder()
将根据归档器/解档器的需要调用。
将符合 NSCoding
的 alertData
实例(这实际上应该是 AlertData
因为 class 名称应该是正确的大小写)放入数组(或字典,如果你请)并执行此操作:
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
。)