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

标签 ios swift nsuserdefaults

我正在创建一个快速应用程序,用于跟踪用户在 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/

相关文章:

swift - 在 NSUserDefaults 中存储可选的 bool

objective-c - NSUserDefaults 和绑定(bind)

jquery - 为什么我的输入在移动设备上不起作用?

java - ios 以编程方式创建证书请求

ios - 如何使用UIPickerView的选定值作为通知的content.sound?

json - Swift json 使用动态键解码

ios - Objective-C设置bundle设置值

iphone - 一段时间后未调用 CLLocationManager didUpdateToLocation

ios - 如何在 UIWebView swift 中自动播放 YouTube 视频

ios - 无法设置多个 Controller 的 UILabel 字段