讓我們好好管理 UserDefault 中的內容吧!
這裡沒有什麼特別的小故事,只是偶爾看看新手時期(包括我),有時候在使用到
UserDefault
的時候,感覺就是沒有節操的使用 xD。可能像是每次取值都還要判斷 optional 或給莫任職,有時候setValue
失敗,key
打錯等等的原因。為了預防這些狀況,我們必須好好整理這些儲存下來的資訊。
有時候,當使用者登入後,我們需要將他的一些資訊存在本地中,讓他再次開啟 App 時,我們會透過儲存的資訊幫助他登入,讓他不需要特別再登入一次。又或是一些使用整調整後的設定我們希望能夠儲存下來,像是預設音量、夜間模式等等。
你可以想像我們把 UserDefault
作為一個資料庫或是後端 API,你會想要怎麼發請求給他,拿到的 response 又會想要是怎樣,最後根據這些我們來編寫我們 UserDefault
的 class
:
在這邊我們新增了一個叫做 AppDefault
的 class
,並且我們讓它成為一個 singleton,因為我們希望他只有一個,並且無法被實例化。
接下來,假設我們要儲存之前手勢辨識的密碼,我們需要為他邊寫一些功能,那想必基本的架構一定需要「新增」、「刪除」及「修改」的功能,而因為重複 setValue
的話,會覆蓋掉原有的值,因此我們也不需要「修改」這個操作,使用「新增」取代他。所以我們可以先定義下兩個方法:
新增、刪除都結束後,我們需要取得這個手勢的密碼,因此我們還需要一個方法來獲取密碼:
在這個方法中,我們透過 userDefault.array
來取得一個 [Any]
類型的 array,並且我們同時也將它透過 as?
來嘗試轉型為 [Int]
,最後 return
我們的 [Int]?
結果。
如果你不想要取的 Optional 類型的值,我們也能夠在其中判斷是否有值,有值則回傳正常的 array,若無則為空的 array:
或者可以:
接著你會發現我們的 key 通常會輸入一個字串,所以我們會有輸入錯誤的可能,或者當你需要更改 key 時,修改的過程會很麻煩,因為必須一個一個去調整,並且可能還會有遺漏的。因此在這邊我們可以將它用一個常數管理起來:
而當你需要多個 key
時,我們也能夠透過 enum
來管理這些 UserDefault
所需的 key
:
而使用起來可能會像這樣(看起來有點長就是了xD):
接著為了讓我們預防覆蓋的情況,以及了解當前密碼是否有設置,我們可以宣告一個計算變數來回傳是否有手勢密碼的結果,也就是回傳 getGesturePassword()
是否為 nil
的結果:
所以我們可以藉由 getGesturePassword()
的結果得知到目前是否還沒有密碼。最後我們稍微來演示一下過程。
UserDefault 在 App 中使用是一件常見的事情,但也需要好好整理裡面所儲存下來得內容,透過這種方式可以讓我們在 setValue
以及 getValue
更加安全,並且在其中實現我們任何想要的操作,像是判斷、轉型、賦予默認值等等,我們就不需要重複編寫這些程式碼。而之後當有人與你合作時,他也能夠很容易地透過這個 class
輕鬆地設置、取得儲存內容。