LKUserDefaults
という超絶便利なライブラリを試したのでその事を書いてみます。
NSUserDefaultsの使い方
まずはLKUserDefaults
を使わずにNSUserDefaults
へアクセスする方法を書きます。
NSUserDefaults
の値の取得・保存・デフォルト値のセットは通常下のように行います。
// 取得 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSInteger intValue = [userDefaults integerForKey:@"myKey"]; // 保存 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setInteger:100 forKey:@"myKey"]; [userDefaults synchronize]; // デフォルト値のセット NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; // 取得 [userDefaults registerDefaults:@{ @"myKey": @(1) }];
NSUserDefaultsの問題
簡単に値をセットできるNSUserDefaults
なんですが下のような問題があります。
キーを文字列指定するので補完が効かないしミスが起こる
見出しの通りでNSUserDefaults
の値の操作には@"myKey"
のように文字列キーを渡す必要があります。
これは補完も効かないしスペルミスによる思わぬ不具合も招くので宜しくないです。
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSInteger intValue = [userDefaults integerForKey:@"myKey"];
下のようにマクロでkey
を定義すれば少し楽になるのですがマクロが長くなりがちですしあまりスマートな感じがしません。
#define USER_DEFAULTS_KEY_MY_KEY @"myKey" NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSInteger intValue = [userDefaults integerForKey:USER_DEFAULTS_KEY_MY_KEY];
synchronizeのセットを忘れる
NSUserDefaults
を使っていると「[userDefaults synchronize];
を忘れてなぜか値が保存されない。」という現象があります。
これは下のようにセッターメソッドを定義すれば良いのですが、一々メソッドを定義するのが辛いです。
- (void)setMyValue:(int)value { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setInteger:value forKey:@"myKey"]; [userDefaults synchronize]; }
LKUserDefaultsを使った場合
LKUserDefaults
を使うと下のようにプロパティー定義するだけで取得・保存ができるようになります。
@interface MyUserDefaults : LKUserDefaults @property (strong, nonatomic) NSString* myValue; @end
MyUserDefaults *userDefaults = [MyUserDefaults sharedInstance];
userDefaults.name = @"Hoge";
デフォルト値のセットも下のように簡単に書くことができます。
@implementation MyUserDefaults - (void)registerDefaults { self.myValue = @"defaultValue"; } @end
LKUserDefaultsの使い方
LKUserDefaults
はCocoaPods
にも対応しているのでPodfile
に下のように書いてpod install
すれば導入完了です。
pod "LKUserDefaults", :git => 'https://github.com/lakesoft/LKUserDefaults.git'
あとは先ほど書いたようにLKUserDefaults
を継承したクラスを作り、そこにプロパティーを定義すれば完了です。
@interface MyUserDefaults : LKUserDefaults @property (strong, nonatomic) NSString* myValue; @end
Swiftへの対応状況
Swiftでは条件によっては動かす事ができます。
objective-c
で作ったMyUserDefaults
をSwiftから呼ぶ事はできるのですが、Swiftで作ったMyUserDefaults
をSwiftで呼ぶと落ちます。
具体的には下のようなパターンがダメです。
class MyUserDefaults: LKUserDefaults { var myValue: String = "" } MyUserDefaults().myValue = "A"
上のMyUserDefaults
をObjective-c
から使う事は可能でした。
まとめ
LKUserDefaults
はNSUserDefaults
を理想的な形で扱えて最高のライブラリでした!