UserDefaultsとは?
UserDefaultsとは簡単に言うとキーバリュー型のDB(データベース)にアクセスするために用いるもので、これを用いることで、アプリの起動時にキーと値のペアを永続的に保存することができます。その他の特徴を下記に記しておきます。
・< Key, Value >形式の辞書型でアクセス可能。
・各iOSアプリは、1端末に対して1つのUserDefaultsを保持している。
・アプリを削除するとUserDefaultsも消えるため、同じアプリを再インストールしてもUseDefaultsはリセットされる。
UserDefaultsは以上のような特徴を持っていて、主な使用目的としてはユーザーの設定情報(Preferences)を永続的に保存することが目的として挙げられます。
日付更新ごとの処理
今回はこのUserDefaultsを使って、日にちが変わるごとに何かしらの処理を実行してくれるようなプログラムを組んでいきます。
下記が全体コードになります。
import UIKit
// userdefaultsを用意しておく
let UD = UserDefaults.standard
//日付判定関数
func judgeDate(){
//現在のカレンダ情報を設定
let calender = Calendar.current
//日本時間を設定
let now_day = Date(timeIntervalSinceNow: 60 * 60 * 9)
//日付判定結果
var judge = Bool()
// 日時経過チェック
if UD.object(forKey: "today") != nil {
let past_day = UD.object(forKey: "today") as! Date
let now = calender.component(.day, from: now_day)
let past = calender.component(.day, from: past_day)
//日にちが変わっていた場合
if now != past {
judge = true
}
else {
judge = false
}
}
//初回実行のみelse
else {
judge = true
/* 今の日時を保存 */
UD.set(now_day, forKey: "today")
}
/* 日付が変わった場合はtrueの処理 */
if judge == true {
judge = false
//日付が変わった時の処理をここに書く
}
else {
//日付が変わっていない時の処理をここに書く
}
}
まずUserDefaultsが使えるように定数に代入します。
// userdefaultsを用意しておく
let UD = UserDefaults.standard
そしてcalender定数に現在のカレンダー情報を代入、now_dayに現在の日本時間を代入、最後に日付判定を行うBool値の変数を定義します。
func judgeDate(){
//現在のカレンダ情報を設定
let calender = Calendar.current
//日本時間を設定
let now_day = Date(timeIntervalSinceNow: 60 * 60 * 9)
//日付判定結果
var judge = Bool()
次にif文でUserDefaultsのtodayキーに値があるか判定します。
あったらif文内の処理へ、なかったら後ほど解説の初回起動時の処理へ進みます。
if文内の処理ではまず最初にpast_dayにすでに保存してあった日時情報を代入し、nowに現在の日付を代入、そしてpastにpast_dayの日時情報を使って過去の日付を代入します。
if UD.object(forKey: "today") != nil {
let past_day = UD.object(forKey: "today") as! Date
let now = calender.component(.day, from: now_day)
let past = calender.component(.day, from: past_day)
次に先ほど代入したnowがpastと異なる場合はjudgeにtrueを、同一であればfalseを代入します。
if now != past {
judge = true
}
else {
judge = false
}
}
次に初回起動時の処理としてjudgeにtrueを代入し、現在日時をUserDefaultsに設定します。
//初回実行のみelse
else {
judge = true
/* 今の日時を保存 */
UD.set(now_day, forKey: "today")
}
最後にif文で初回起動時・日付変更時にする処理を記述し、else内で日付が変わっていない時にする処理を記述します。
/* 日付が変わった・初回起動時の場合はtrueの処理 */
if judge == true {
judge = false
//日付が変わった時の処理をここに書く
}
else {
//日付が変わっていない時の処理をここに書く
}
}