問題は、NSUserDefaults
でカスタムオブジェクトを保存することはできません。しかしDayData
のすべてのプロパティは、対応のプロパティリストされているので、あなたは辞書とその逆にDayData
を変換するNSUserDefaults
の拡張を書くことができるということです。
この拡張子は、DayData
オブジェクトと辞書[String:DayData]
という1つのオブジェクトを書き込むことができます。
extension NSUserDefaults {
// read a write a single 'DayData' object
func dayDataForKey(key: String) -> DayData? {
guard let data = self.objectForKey(key) as? [String:AnyObject] else { return nil }
return DayData(sales: data["sales"] as! Int, doorsKnocked: data["doorsKnocked"] as! Int, milesWalked: data["milesWalked"] as! Double, hoursWorked: data["hoursWorked"] as! Double)
}
func setDayData(dayData : DayData, forKey key: String) {
let propertyListRepresentation = ["sales": dayData.sales, "doorsKnocked" : dayData.doorsKnocked, "milesWalked": dayData.milesWalked, "hoursWorked": dayData.hoursWorked]
self.setObject(propertyListRepresentation, forKey: key)
}
// read a write a dictionary ('[String:DayData]') object
func dayDataDictionaryForKey(key: String) -> [String: DayData]? {
guard let dayData = self.objectForKey(key) as? [String : [String: AnyObject]] else { return nil }
var result = [String: DayData]()
for (key, value) in dayData {
result[key] = DayData(sales: value["sales"] as! Int, doorsKnocked: value["doorsKnocked"] as! Int, milesWalked: value["milesWalked"] as! Double, hoursWorked: value["hoursWorked"] as! Double)
}
return result
}
func setDayDataDictionary(dayData : [String: DayData], forKey key: String) {
var result = [String : [String: AnyObject]]()
for (key, value) in dayData {
result[key] = ["sales": value.sales, "doorsKnocked" : value.doorsKnocked, "milesWalked": value.milesWalked, "hoursWorked": value.hoursWorked]
}
self.setObject(result, forKey: key)
}
}
今、あなたは簡単にユーザーのデフォルトに辞書を書き込むことができます。
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setDayDataDictionary(allInformationByDate, forKey: "allInfoByDateRecord")
または
let defaults = NSUserDefaults.standardUserDefaults()
if let infoByDateDefault = defaults.dayDataDictionaryForKey("allInfoByDateRecord") {
allInformationByDate = infoByDateDefault
}
それを読んだあなたは、クラスNSCodingに準拠代わりに構造体を使用してにNSKeyedArchiverを使用する必要がありますオブジェクトをNSDataに変換してNSUserDefaultsまたはplistファイルに保存します –
上記に加えて、 'setValue:forKey:'の代わりに 'setObject:forKey:'を呼び出す必要があります。 (AnyObjectは「すべてのクラスが暗黙に準拠しているプロトコル」 - 構造体などの値型はクラスではありません) – titaniumdecoy
@LeoDabus私はちょうど言った言葉を理解しません。しかし、それは合法的だと思われる... – adman