UserDefaults 的預設值

UserDefaults 很適合用來儲存簡單的資料,比方記錄使用者是否第一次使用 App,上次打開 App 的時間等。

接下來讓我們看看一個特別的例子:

let isFirstOpenApp = UserDefaults.standard.bool(forKey: "isFirstOpenApp")

以上程式我們利用 isFirstOpenApp 判斷使用者是否第一次打開 App,若是第一次則顯示教學畫面。然而此時卻有個問題,第一次打開 App 時,UserDefaults 的 isFirstOpenApp 沒有東西,但 bool(forKey:) 卻會回傳 false。我們想要的效果應該是第一次打開 App 時得到 true,然後將它改成 false,下次打開 App 時不再顯示教學畫面。

此問題有很多解法,比方判斷 UserDefaults 的 object(forKey:) 回傳值是否為 nil,或是將 key 改成 isNotFirstOpenApp,如此一開始值為 false 時,即表示第一次打開 App。

不過其實有個更直覺的方法,我們可以設定 UserDefaults 的預設內容,例如以下程式:

let dic = ["isFirstOpenApp": true]UserDefaults.standard.register(defaults: dic)

透過 UserDefaults 的 function register(defaults:) 傳入的 dictionary,我們可以設定預設內容。之後當我們讀取 UserDefaults ,傳入的 key 找不到對應的 value 時,它將回傳 register 設定的 dictionary 內容。

不過有一點要特別注意,register 設定的內容是暫存的,並沒有存檔,所以每次 App 重新啟動時都要再設定一次,比方以下範例在 AppDelegate 的 application(_:didFinishLaunchingWithOptions:) 設定。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let dic = ["isFirstOpenApp": true]
UserDefaults.standard.register(defaults: dic)
return true
}

Apple 官方說明

The contents of the registration domain are not written to disk; you need to call this method each time your application starts. You can place a plist file in the application's Resources directory and call register(defaults:) with the contents that you read in from that file.

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com