この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
NSUserDefaults カンタン使用法
NSUserDefaults は、小規模なデータを保存するのにベンリですね。しかしながら、いささか記述が長いので、繰り返し様々なところで使う場合、ちょっとだるいかもしれません。
そこで今回は、NSUserDefaults を扱う Helper クラスを作成し、短い&見やすい&書きやすい記述でデータ保存を行う方法を扱います。
Helperクラスを作成
まず最初に一手間かけます。データ保存のための Helper クラスを作成します。今回は、以下のクラスが登場します。
- ViewController クラス(プロジェクト生成時に自動的に作成されたものを利用)
- DataSaveHelper クラス
まずは DataSaveHelper クラスから見て行きましょう。
ヘッダファイル
DataSaveHelper.h
#import "Foundation/Foundation.h"
@interface DataSaveHelper : NSObject
@property (nonatomic) BOOL initialized;
@property (nonatomic) NSInteger howManyTimesAppLaunched;
@end
セーブするデータは以下の2種類です。それぞれプロパティとして定義しています。
- 初回起動時の初期化が済んだかを表す Bool 型の initialized
- 起動回数を表す NSInteger 型の howManyTimesAppLaunched
実装ファイル
実装ファイルでは、プロパティにより生成されたゲッタ・セッタをオーバーライドしています。永続化領域から値を読み込んで返したり、永続化領域に値を書き込んだりしています。
DataSaveHelper.m
#import "DataSaveHelper.h"
static NSString *const kKeyInitialized = @"initialized";
static NSString *const kKeyHowManyTimesAppLaunched = @"howManyTimesAppLaunched";
@implementation DataSaveHelper
- (BOOL)initialized
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kKeyInitialized];
}
- (void)setInitialized:(BOOL)initialized
{
[[NSUserDefaults standardUserDefaults] setBool:initialized forKey:kKeyInitialized];
}
- (NSInteger)howManyTimesAppLaunched
{
return [[NSUserDefaults standardUserDefaults] integerForKey:kKeyHowManyTimesAppLaunched];
}
- (void)setHowManyTimesAppLaunched:(NSInteger)howManyTimesAppLaunched
{
[[NSUserDefaults standardUserDefaults] setInteger:howManyTimesAppLaunched forKey:kKeyHowManyTimesAppLaunched];
}
具体的に見て行きましょう。
キーの名前を予め定数として指定
static NSString *const kKeyInitialized = @"initialized";
static NSString *const kKeyHowManyTimesAppLaunched = @"howManyTimesAppLaunched";
このように定義しておくことで、補完が聞きますし、キー名のミスタイプも防げますね。
ゲッタ
- (BOOL)initialized
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kKeyInitialized];
}
キーを指定して、値を取得後、値を返しています。
セッタ
- (void)setInitialized:(BOOL)initialized
{
[[NSUserDefaults standardUserDefaults] setBool:initialized forKey:kKeyInitialized];
}
キーを指定して、値を永続化領域に書き込んでいます。
上記セッタであれば、- (void)setInit あたりまで入力した時点で、 - (void)setInitialized:(BOOL)initialized まで補完してくれるでしょう。スラスラかけて、楽しいですね。
ViewController
ViewController.m
#import "ViewController.h"
#import "DataSaveHelper.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
DataSaveHelper *helper = [DataSaveHelper new];
if (helper.initialized) {
NSLog(@"初回起動時の初期化は済んでいます");
} else {
helper.initialized = YES;
// 初回起動時の初期化処理など
}
helper.howManyTimesAppLaunched ++;
NSLog(@"%ld", helper.howManyTimesAppLaunched);
}
今回は Helper クラスの動作確認が目的ですので、viewDidLoadに直接書き込んでいきます。
上記では、DataSaveHelper クラスのインスタンスを生成し、ドット記法でゲッタ・セッタにアクセスし、値をセーブ・取得しています。
initialized を見て、もし初期化されていなかったら初期化処理をし、そうでなかったら、ログだけ出力。
その後、
viewDidLoad が呼ばれた回数 = 起動回数
と見做し、howManyTimesAppLaunched の値をインクリメント。起動回数をNSLogで出力しています。
こんなふうに、補完が効くので、データセーブ箇所で毎回 NSUserDefaults クラスやキー名の記述をするより、間違いが少なくなりますし、スラスラかけてコーディングが楽しくなりますね!
この手法は広く知られているとは思うのですが、まだ試されていない方は是非!