2014-10-06 45 views
1

我試圖通過製作一個小應用程序來讓我的頭圍繞Swift(在相對勝任Obj-C之後)。我想使用NSUserDefaults來持久保存少量的數據,但我遇到了問題。將Swift數組轉換爲NSData NSUserDefaults.StandardUserDefaults持久存儲

我初始化的元組空數組像這樣:

var costCategoryArray: [(name:String, defaultValue:Int, thisMonthsEstimate:Int, sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float)]=[] 

當陣列具有一個條目,我想在陣列保存到標準SWIFT代碼NSUserDefaults的如此:

NSUserDefaults.standardUserDefaults().setObject(costCategoryArray, forKey: "financialData") 
NSUserDefaults.standardUserDefaults().synchronize() 

我得到一個錯誤,說元組數組不符合AnyObject類。所以我試圖把它變成NSData:

var myNSData: NSData = NSKeyedArchiver.archivedDataWithRootObject(costCategoryArray) 
var myUnarchivedData: Array = NSKeyedUnarchiver.unarchiveObjectWithData(myNSData) 

...但我在轉換到NSData時得到相同的錯誤。我的數組所持有的對象不符合AnyObject。我也試着在每一個階段,使其一成不變使用:

let immutableArray = costCategoryArray 

香港專業教育學院還試圖創建一個類,而不是使用我明白這將使它符合AnyObject元組:

class costCategory : NSObject { 
    var name : String 
    var defaultValue : Int 
    var thisMonthsEstimate : Int 
    var sumOfThisMonthsActuals : Int 
    var riskFactor : Float 
    var monthlyAverage : Float 


    init (name:String, defaultValue:Int, thisMonthsEstimate:Int,  sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float) { 
     self.name = name 
     self.defaultValue = defaultValue 
     self.thisMonthsEstimate = thisMonthsEstimate 
     self.sumOfThisMonthsActuals = sumOfThisMonthsActuals 
     self.riskFactor = riskFactor 
     self.monthlyAverage = monthlyAverage 
    } 
} 

但新的錯誤是:

「屬性列表無效的格式:200(屬性列表不能包含類型‘CFType’的對象)」

什麼是TU數組問題普萊斯?爲什麼我不能存儲一個類對象的數組?我覺得我需要一些專家建議,因爲到目前爲止,我試圖用Swift做的一切幾乎是不兼容的...

謝謝! 「financialData」的

+0

真的嗎?沒有人可以幫助保存NSUser默認的對象數組?即使它們與NSUser默認設置無關,我也會對任何建議感到滿意。 – user3535074 2014-10-07 09:03:08

回答

-3

值應在報價:你正在歸檔至的NSData和背部

NSUserDefaults.standardUserDefaults().setObject("costCategoryArray", forKey: "financialData") 
NSUserDefaults.standardUserDefaults().synchronize() 
+1

然後,我會不會只是將字符串「costCategoryData」到NSUserDefaults而不是數組costCategoryData? – user3535074 2014-10-06 21:16:52

+0

是的,你是對的! – user3260511 2014-10-06 22:06:06

8

任何需要實現NSCoding協議。我發現另外,我的Swift類必須擴展NSObject。下面是Swift類的一個快速編碼和解碼示例:

class B : NSObject, NSCoding { 
    var str : String = "test" 

    required init(coder aDecoder: NSCoder) { 
     str = aDecoder.decodeObjectForKey("str") as String 
    } 

    override init() { 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(str, forKey: "str") 
    } 
} 

// create an Object of Class B 
var b : B = B() 

// Archive it to NSData 
var data : NSData = NSKeyedArchiver.archivedDataWithRootObject(b) 

// Create a new object of Class B from the data 
var b2 : B = NSKeyedUnarchiver.unarchiveObjectWithData(data) as B