簡體   English   中英

無法檢索自定義Swift對象的已保存數組

[英]Unable to retrieve saved array of custom Swift objects

我正在創建一個快速的應用程序,用於跟蹤Swift中的用戶購買情況。 有一個Purchase類,我試圖將其中的NSMutableArray保存為用戶默認值。

當我去加載數據時,首先按下退出應用程序以觸發保存后,其他的總是運行。 不過,檢索整數值(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")
} 

}

您的購買班級需要進行以下改進

if let喜歡,請使用guard聲明,而不要使用guard聲明

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

忘記initWithCoder內部的init調用,它已經在初始化您的對象,因此您無需再次進行init

也可以嘗試使用encodeObject來保存數據,例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM