iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
0

讓我們好好管理 UserDefault 中的內容吧!

? 隕石小故事

這裡沒有什麼特別的小故事,只是偶爾看看新手時期(包括我),有時候在使用到 UserDefault 的時候,感覺就是沒有節操的使用 xD。可能像是每次取值都還要判斷 optional 或給莫任職,有時候 setValue 失敗,key 打錯等等的原因。為了預防這些狀況,我們必須好好整理這些儲存下來的資訊。

Overview

有時候,當使用者登入後,我們需要將他的一些資訊存在本地中,讓他再次開啟 App 時,我們會透過儲存的資訊幫助他登入,讓他不需要特別再登入一次。又或是一些使用整調整後的設定我們希望能夠儲存下來,像是預設音量、夜間模式等等。


實作

|管理儲存資訊

你可以想像我們把 UserDefault 作為一個資料庫或是後端 API,你會想要怎麼發請求給他,拿到的 response 又會想要是怎樣,最後根據這些我們來編寫我們 UserDefaultclass

在這邊我們新增了一個叫做 AppDefaultclass,並且我們讓它成為一個 singleton,因為我們希望他只有一個,並且無法被實例化。

接下來,假設我們要儲存之前手勢辨識的密碼,我們需要為他邊寫一些功能,那想必基本的架構一定需要「新增」、「刪除」及「修改」的功能,而因為重複 setValue 的話,會覆蓋掉原有的值,因此我們也不需要「修改」這個操作,使用「新增」取代他。所以我們可以先定義下兩個方法:

新增、刪除都結束後,我們需要取得這個手勢的密碼,因此我們還需要一個方法來獲取密碼:

在這個方法中,我們透過 userDefault.array 來取得一個 [Any] 類型的 array,並且我們同時也將它透過 as? 來嘗試轉型為 [Int],最後 return 我們的 [Int]? 結果。

如果你不想要取的 Optional 類型的值,我們也能夠在其中判斷是否有值,有值則回傳正常的 array,若無則為空的 array:

或者可以:

接著你會發現我們的 key 通常會輸入一個字串,所以我們會有輸入錯誤的可能,或者當你需要更改 key 時,修改的過程會很麻煩,因為必須一個一個去調整,並且可能還會有遺漏的。因此在這邊我們可以將它用一個常數管理起來:

而當你需要多個 key 時,我們也能夠透過 enum 來管理這些 UserDefault 所需的 key

而使用起來可能會像這樣(看起來有點長就是了xD):

接著為了讓我們預防覆蓋的情況,以及了解當前密碼是否有設置,我們可以宣告一個計算變數來回傳是否有手勢密碼的結果,也就是回傳 getGesturePassword() 是否為 nil 的結果:

所以我們可以藉由 getGesturePassword() 的結果得知到目前是否還沒有密碼。最後我們稍微來演示一下過程。


Summary

UserDefault 在 App 中使用是一件常見的事情,但也需要好好整理裡面所儲存下來得內容,透過這種方式可以讓我們在 setValue 以及 getValue 更加安全,並且在其中實現我們任何想要的操作,像是判斷、轉型、賦予默認值等等,我們就不需要重複編寫這些程式碼。而之後當有人與你合作時,他也能夠很容易地透過這個 class 輕鬆地設置、取得儲存內容。


上一篇
D18 - Ctrl+C & Ctrl+V 複製大法
下一篇
D20 - TableView 就決定是你了!使出折疊!
系列文
諸神黃昏下的 iOS 工程師31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言