iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
0
Software Development

iOS 從 Objective-c 進化為 Swift 的 30天之旅系列 第 10

[Day 10] Swift UserDefault 在Model裡大爆炸

  • 分享至 

  • xImage
  •  

前言

計畫新增兩個Model
第一個Model 儲存變數用
比如 name,age,tel
第二個Model 儲存第一個Model list
並且創造一些方法
讓controller 呼叫
以上都是我的構想

第一個Model ProductItemtMode.swift

單存存一些變數

class ProductItemtMode: NSObject {
    var foodName: String?
    var cookTime: String?
}

UserDefault 基本用法

//儲存
var userDefaults = UserDefaults.standard
userDefaults.set("Value", forKey: "Key")
userDefaults.synchronize()

//取值
userDefaults.value(forKey: "Key")

UserDefault 資料轉data 在儲存?

一開始用直接 Array存Model在存進UserDefault
但是直接崩潰 說資料格式不符合
上網查需要轉Data存?
錯誤代碼

2018-10-14 23:09:20.882490+0800 Chuhuo[24106:503054] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
    "<Chuhuo.ProductItemtMode: 0x60000292d3e0>",
    "<Chuhuo.ProductItemtMode: 0x60000292d3e0>"
) for key productList'

所以先轉Data 再變存進去
結果成功

封存

let data = NSData(bytes: &productList, length: productList.count) //Array 轉 Data
let encodedObject = NSKeyedArchiver.archivedData(withRootObject: data) 

解開

let object = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data)

第二個Model ProductMode.swift

就是一開始說得一樣
儲存第一個Model
以及有個func可以 儲存 讀取 資料

class ProductMode: NSObject {
    func appendUserdefultTest(productMode: ProductItemtMode) {
        var userDefaults = UserDefaults.standard
        var productList = [ProductItemtMode]()
        
        if (userDefaults.value(forKey: "productList") == nil){
             
            //存取
            productList.append(productMode)
            let data = NSData(bytes: &productList, length: productList.count)
            let encodedObject = NSKeyedArchiver.archivedData(withRootObject: data)
            userDefaults.set(encodedObject, forKey: "productList")
            userDefaults.synchronize()
    
            
            //取出來
            let decodedObject = userDefaults.data(forKey: "productList") as NSData?
            if let decoded = decodedObject {
                let object = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data)
                let data = object as? NSData
            }
        }  
    }
}

看似完美 轉換成data
print時是跟取出來是一樣的
證明讀與取的功能皆正常發揮
但是!!但是!!但是!!

我怎麼找都不知道怎麼把Data轉成
我一開始宣告的Array

var productList = [ProductItemtMode]() 

真的是對Swift還不熟 沒辦法像OC變來變去

原本的productList可以直接
productList[0].foodName
去呼叫
但現在沒辦法啊啊啊啊啊
卡關了
只好繼續努力找找看了
如果真的找不到
我就要改用Sqlite

如果知道怎麼data轉換成我的var productList = ProductItemtMode
歡迎留言告訴我 謝謝

最新文章

金魚也學得會的「KD指標」! 什麼是KD黃金交叉、KD死亡交叉 - 2021年

RSI指標? 看我就好 新手好入門


上一篇
[Day 9] Swift Extension 與 Class 使用範例
下一篇
[Day 11] Swift Xcode CocoaPods 安裝初體驗 第三方管理套件
系列文
iOS 從 Objective-c 進化為 Swift 的 30天之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言