gpt4 book ai didi

ios - 无法检索保存的自定义 Swift 对象数组

转载 作者:行者123 更新时间:2023-11-30 13:35:31 24 4
gpt4 key购买 nike

我正在创建一个快速应用程序,用于跟踪用户在 Swift 中的购买情况。有一个 Purchase 类,我正在尝试将这些类的 NSMutableArray 保存到用户默认值。

当我去加载数据时,在第一次按下退出应用程序以触发保存后,总是会运行else。不过,检索整数金额(KEY_WEEKLY_AMOUNT 的数据)始终会成功。

class UserDatas {
static let sharedInstance = UserDatas()
let defaults = NSUserDefaults.standardUserDefaults()
let KEY_ARRAY_OF_PURCHASES = "KEY_ARRAY_OF_PURCHASES"
let KEY_WEEKLY_AMOUNT = "KEY_WEEKLY_AMOUNT"

var arrayOfUserPurchases:NSMutableArray = NSMutableArray()
var weeklyAmount:Int = 0


func saveTheDatas() {

let arrayOfArchivedDatas = NSKeyedArchiver.archivedDataWithRootObject(arrayOfUserPurchases)
defaults.setObject(arrayOfArchivedDatas, forKey: KEY_ARRAY_OF_PURCHASES)

defaults.setInteger(weeklyAmount, forKey: KEY_WEEKLY_AMOUNT)

print("Saved data.")
}

func loadTheDatas() {
if let decodedNSDataBlob = defaults.objectForKey(KEY_ARRAY_OF_PURCHASES) as? NSData {
if let unarchivedArray = NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSDataBlob) as? NSArray {

self.arrayOfUserPurchases = NSMutableArray.init(array: unarchivedArray)
}
} else {

// THIS ALWAYS HAPPENS. //

print("No Purchases yet! Initializing with blank array.")
arrayOfUserPurchases = NSMutableArray()
return
}

let savedWeeklyAmount = defaults.integerForKey(KEY_WEEKLY_AMOUNT)
self.weeklyAmount = savedWeeklyAmount
print("Loaded saved weekly amount: \(savedWeeklyAmount).")

}

以及购买类:

class Purchase : NSObject, NSCoding {

let KEY_PURCHASE_AMOUNT = "PURCHASE_AMOUNT"
let KEY_PURCHASE_CATEGORY = "PURCHASE_CATEGORY"
let KEY_PURCHASE_TIME = "PURCHASE_TIME"
let KEY_PURCHASE_DATE = "PURCHASE_DATE"

var amount:Int = 0
var time:String = ""
var date:String = ""
var category:Int = 0
var valid:Bool = false

init(amount:Int, time:String, date:String, category:Int) {
self.amount = amount
self.time = time
self.date = date
self.category = category
self.valid = true
}

override init() {
self.valid = false
}

// MARK: NSCoding
required convenience init?(coder aDecoder: NSCoder) {

guard let amount = aDecoder.decodeObjectForKey("amount") as? Int
else {
self.init()
return
}
guard let time = aDecoder.decodeObjectForKey("time") as? String
else {
self.init()
return
}
guard let date = aDecoder.decodeObjectForKey("date") as? String
else {
self.init()
return
}
guard let category = aDecoder.decodeObjectForKey("category") as? Int
else {
self.init()
return
}
guard let valid = aDecoder.decodeObjectForKey("valid") as? Bool
else {
self.init()
return
}

self.init(amount: amount, time: time, date: date, category: category)
}



func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeInt(Int32(self.amount), forKey: "amount")
aCoder.encodeObject(self.time, forKey: "time")
aCoder.encodeObject(self.date, forKey: "date")
aCoder.encodeInt(Int32(self.category), forKey: "category")
aCoder.encodeBool(self.valid, forKey: "valid")
}

}

最佳答案

您的购买类别需要进行以下改进

不要使用 guard 语句,而是使用 if let

if let amount = aDecoder.decodeObjectForKey("amount") as? Int
{
self.amount = amount
}

忘记 initWithCoder 中的 init 调用,它已经初始化了您的对象,因此您不需要再次初始化

还尝试使用 encodeObject 保存数据,例如

aCoder.encodeObject(amount, forKey: "amount")

关于ios - 无法检索保存的自定义 Swift 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36120397/

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