gpt4 book ai didi

arrays - 在 Swift 中保留一组自定义结构

转载 作者:搜寻专家 更新时间:2023-10-31 22:21:33 25 4
gpt4 key购买 nike

我正在尝试存储一组自定义结构。

在我下面的尝试中,我在 saveSampleArrayOfQuerySettings() 的第二行中遇到运行时错误,提示转换为 AnyObject。

struct QuerySettings {

// let ARRAY_INDEX_WHERE_TO_SAVE_STRUCT = 0

let QUERY_SETTINGS_KEY = "querysettings"
let defaults = NSUserDefaults.standardUserDefaults()

private var _includeCompletedReminders: Bool = false // Default value
var includeCompletedReminders: Bool {
get {
// If value has been set before then use it otherwise retrieve it.
return _includeCompletedReminders
} set (newVal) {
_includeCompletedReminders = newVal
// saveSettings(self, index: ARRAY_INDEX_WHERE_TO_SAVE_STRUCT, saveKey: QUERY_SETTINGS_KEY)
}
}

private var _includeRemindersWithNoDueDate: Bool = true
var includeRemindersWithNoDueDate: Bool {
get {
return _includeRemindersWithNoDueDate
} set (newVal) {
_includeRemindersWithNoDueDate = newVal
// saveSettings(self, index: ARRAY_INDEX_WHERE_TO_SAVE_STRUCT, saveKey: QUERY_SETTINGS_KEY)
}
}
}

func saveSampleArrayOfQuerySettings(saveKey: String) {
let sampleArray = [QuerySettings(), QuerySettings()]

// Persist
let archivedSettingsArray = NSKeyedArchiver.archivedDataWithRootObject(sampleArray as! AnyObject)

// RUNTIME ERROR AT PREVIOUS LINE: "Could not cast value of type 'Swift.Array<RemindersPro.QuerySettings>' (0x112df10d8) to 'Swift.AnyObject' (0x1169d6018)."

NSUserDefaults.standardUserDefaults().setObject(archivedSettingsArray, forKey: saveKey)
NSUserDefaults.standardUserDefaults().synchronize()

// For Testing Purposes - Load the saved settings
if let retrievedArchivedSettingsArray : AnyObject = NSUserDefaults.standardUserDefaults().objectForKey(saveKey) {
if let settingsArray : AnyObject = NSKeyedUnarchiver.unarchiveObjectWithData(retrievedArchivedSettingsArray as! NSData) {
let arr = settingsArray as! [QuerySettings]
print(arr.first)
}
}
}

saveSampleArrayOfQuerySettings("saveKey")

我想知道我是否需要对我的结构进行编码。我查看了这些帖子,但奇怪的是甚至无法让帖子中的示例正常工作(更不用说将它们应用到我的代码中了。)

How to save an array of objects to NSUserDefault with swift?

(Swift) Storing and retrieving Array to NSUserDefaults

How to save an array of custom structs to plist swift

你能告诉我如何让它工作吗?

最佳答案

你的代码太冗长了:

  1. 您不需要显式定义类型。分配默认值 truefalse足以让编译器推断出您想要 Bool . Swift 的构建理念是编译器可以变得非常智能以减轻程序员的负担。
  2. 您的自定义 getter 和 setter 没有什么特别之处,因此最好让 Swift 自动合成它。

现在,关于归档的话题:你会很沮丧地得知 NSCoding仅适用于继承自 NSObject 的对象.结构不能符合 NSCoding .您需要将它包装在一个辅助类中。


这是我想出的:

1。定义一个辅助类来序列化结构:

protocol ArchivableStruct {
var dataDictionary: [String: AnyObject] { get }
init(dataDictionary aDict: [String: AnyObject])
}

class StructArchiver<T: ArchivableStruct>: NSObject, NSCoding {
var structValue: T

init(structValue: T) {
self.structValue = structValue
}

func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.structValue.dataDictionary, forKey: "dataDictionary")
}

required init?(coder aDecoder: NSCoder) {
let dataDictionary = aDecoder.decodeObjectForKey("dataDictionary") as! [String: AnyObject]
self.structValue = T(dataDictionary: dataDictionary)
}
}

2。将结构中的数据导出到字典中

字典是被归档的。在返回的路上,我们简单地解压这个 Dictionary 以获取结构。我们不需要担心 QUERY_SETTINGS_KEYdefaults因为前者是常量,而后者有自己的数据源(NSUserDefaults)。

struct QuerySettings: ArchivableStruct {
let QUERY_SETTINGS_KEY = "querysettings"
let defaults = NSUserDefaults.standardUserDefaults()

var includeCompletedReminders = false
var includeRemindersWithNoDueDate = true

init(includeCompletedReminders: Bool, includeRemindersWithNoDueDate: Bool) {
self.includeCompletedReminders = includeCompletedReminders
self.includeRemindersWithNoDueDate = includeRemindersWithNoDueDate
}

// --------------------------------------
// ArchivableStruct protocol
// --------------------------------------
var dataDictionary: [String: AnyObject] {
get {
return [
"includeCompletedReminders": self.includeCompletedReminders,
"includeRemindersWithNoDueDate": self.includeRemindersWithNoDueDate
]
}
}

init(dataDictionary aDict: [String : AnyObject]) {
self.includeCompletedReminders = aDict["includeCompletedReminders"] as! Bool
self.includeRemindersWithNoDueDate = aDict["includeRemindersWithNoDueDate"] as! Bool
}
}

3。映射自 struct到辅助类

因为您没有归档 QuerySetting struct 但是它们的数组,还有一个额外的步骤将它映射到 StructArchiver<T>以便您的数组可以存档:

// Set up a sample array
let a = QuerySettings(includeCompletedReminders: true, includeRemindersWithNoDueDate: false)
let b = QuerySettings(includeCompletedReminders: false, includeRemindersWithNoDueDate: true)
let sampleArray = [a, b]

// Archive
let wrapperArray = sampleArray.map { StructArchiver(structValue: $0) }
let data = NSKeyedArchiver.archivedDataWithRootObject(wrapperArray)

// Unarchive
let unwrapperArray = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [StructArchiver<QuerySettings>]
let unarchivedArray = unwrapperArray.map { $0.structValue }

关于arrays - 在 Swift 中保留一组自定义结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34571985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com