【Swift】NSUserDefaults를 편리하게 사용하는 몇 가지 방법
소개
NSUserDefaults
쉽게 다루고 싶다 NSUserDefaults.standardDefaults()
매번 쓰고 싶지 않아 등등의 불만으로부터, NSUserDefaults를 다루는 방법에 대해 여러가지 조사해 보고 시행착오한 결과를 남겨 둡니다.
타이틀에 「몇개인가」라고 쓰고 있습니다만, 2개만입니다
좋은 방법을 아시는 분, 교수해 주세요.
1. enum에서 키 정의
enum에서 NSUserDefaults를 편리하게
위의 기사를 참고로 해 enum
를 사용해 NSUserDefaults
를 사용하는 방법을 생각해 보았습니다.
거의 거의 위의 기사대로입니다만, 키에 대응하는 값의 형태를 명확하게 하고 싶었으므로, 형태를 나누기 위한 enum
를 중첩해 넣어 보았습니다.
enum UserDefaults {
// Bool型の値を持つキーをcaseで定義
enum BoolValue: String {
case SomeFlag
func set(value: Bool) {
NSUserDefaults.standardUserDefaults().setBool(value, forKey: self.rawValue)
NSUserDefaults.standardUserDefaults().synchronize()
}
func get() -> Bool {
return NSUserDefaults.standardUserDefaults().boolForKey(self.rawValue)
}
}
// Int型の値を持つキーをcaseで定義
enum IntValue: String {
case UserID
func set(value: Int) {
NSUserDefaults.standardUserDefaults().setInteger(value, forKey: self.rawValue)
NSUserDefaults.standardUserDefaults().synchronize()
}
func get() -> Int {
return NSUserDefaults.standardUserDefaults().integerForKey(self.rawValue)
}
}
// String型の値を持つキーをcaseで定義
enum StringValue: String {
// ...
}
// 略...
}
사용시
UserDefaults.IntValue.UserID.set(1)
let userId = UserDefaults.IntValue.UserID.get() // 1
키에 어떤 타입의 값을 넣을지는 명확해졌지만,
정의의 단계에서는, 형 마다 get 메소드와 set 메소드를 만들고 있으므로, 조금 번거롭습니다.
또, 사용시라도enum
의 네스트가 깊은 분, 「.」연결이 많아져 버린다고 하는 점에서는 조금 사용하기 어려워져 버린 느낌이 있습니다.
2. struct의 속성으로 키를 정의합니다.
2번째입니다만, 이쪽에 관해서는 아래와 같은 라이브러리를 참고로 했습니다.
htps : // 기주 b. 코 m / 라데 x / 슈 f 추세 r로 보는 lts
(그대로 그 라이브러리를 사용할 수 있다고 말하는 것은 일단 두고있어 )
struct UserDefaultsKeys {
// ここにキーを定義していく
static var hasLoginKey = DefaultsKey<Bool>("someFlag")
static var userID = DefaultsKey<Int>("userID")
}
struct DefaultsKey<ValueType> {
let key: String
init(_ key: String) {
self.key = key
}
}
extension NSUserDefaults {
subscript(key: DefaultsKey<Bool>) -> Bool {
get {
return boolForKey(key.key)
}
set {
setBool(newValue, forKey: key.key)
synchronize()
}
}
subscript(key: DefaultsKey<Int>) -> Int {
get {
return integerForKey(key.key)
}
set {
setInteger(newValue, forKey: key.key)
synchronize()
}
}
subscript(key: DefaultsKey<String>) -> String {
// ...
}
// 略...
}
사용시
let UserDefaults = NSUserDefaults.standardUserDefaults()
UserDefaults[UserDefaultsKeys.userID] = 1
let userId = UserDefaults[UserDefaultsKeys.userID]
이쪽도 형마다 subscript를 써 getter와 setter를 구현하고 있습니다만,
subscript로 액세스할 수 있는 분, 직관적으로 값의 get, set를 실시하기 쉽다는 것은 좋네요.
또, DefaultsKey
구조체로 제네릭스를 이용해 다양한 형태를 받을 수 있도록 해, NSDefaults의 확장으로 그 형태에 대응하는 subscript를 만드는 것은 공부가 됩니다.
마지막으로
거의 스스로 생각했다고 하는 것이 아니기 때문에 기사로 하는 것도 어색합니다만,,enum
이나 subscript
, 제네릭스의 활용 등은 이번 여러가지 생각해 보아 대단히 공부가 되었습니다.
Reference
이 문제에 관하여(【Swift】NSUserDefaults를 편리하게 사용하는 몇 가지 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/taji-taji/items/edc1bad4709ce0e0a154
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
enum UserDefaults {
// Bool型の値を持つキーをcaseで定義
enum BoolValue: String {
case SomeFlag
func set(value: Bool) {
NSUserDefaults.standardUserDefaults().setBool(value, forKey: self.rawValue)
NSUserDefaults.standardUserDefaults().synchronize()
}
func get() -> Bool {
return NSUserDefaults.standardUserDefaults().boolForKey(self.rawValue)
}
}
// Int型の値を持つキーをcaseで定義
enum IntValue: String {
case UserID
func set(value: Int) {
NSUserDefaults.standardUserDefaults().setInteger(value, forKey: self.rawValue)
NSUserDefaults.standardUserDefaults().synchronize()
}
func get() -> Int {
return NSUserDefaults.standardUserDefaults().integerForKey(self.rawValue)
}
}
// String型の値を持つキーをcaseで定義
enum StringValue: String {
// ...
}
// 略...
}
UserDefaults.IntValue.UserID.set(1)
let userId = UserDefaults.IntValue.UserID.get() // 1
2번째입니다만, 이쪽에 관해서는 아래와 같은 라이브러리를 참고로 했습니다.
htps : // 기주 b. 코 m / 라데 x / 슈 f 추세 r로 보는 lts
(그대로 그 라이브러리를 사용할 수 있다고 말하는 것은 일단 두고있어 )
struct UserDefaultsKeys {
// ここにキーを定義していく
static var hasLoginKey = DefaultsKey<Bool>("someFlag")
static var userID = DefaultsKey<Int>("userID")
}
struct DefaultsKey<ValueType> {
let key: String
init(_ key: String) {
self.key = key
}
}
extension NSUserDefaults {
subscript(key: DefaultsKey<Bool>) -> Bool {
get {
return boolForKey(key.key)
}
set {
setBool(newValue, forKey: key.key)
synchronize()
}
}
subscript(key: DefaultsKey<Int>) -> Int {
get {
return integerForKey(key.key)
}
set {
setInteger(newValue, forKey: key.key)
synchronize()
}
}
subscript(key: DefaultsKey<String>) -> String {
// ...
}
// 略...
}
사용시
let UserDefaults = NSUserDefaults.standardUserDefaults()
UserDefaults[UserDefaultsKeys.userID] = 1
let userId = UserDefaults[UserDefaultsKeys.userID]
이쪽도 형마다 subscript를 써 getter와 setter를 구현하고 있습니다만,
subscript로 액세스할 수 있는 분, 직관적으로 값의 get, set를 실시하기 쉽다는 것은 좋네요.
또,
DefaultsKey
구조체로 제네릭스를 이용해 다양한 형태를 받을 수 있도록 해, NSDefaults의 확장으로 그 형태에 대응하는 subscript를 만드는 것은 공부가 됩니다.마지막으로
거의 스스로 생각했다고 하는 것이 아니기 때문에 기사로 하는 것도 어색합니다만,,enum
이나 subscript
, 제네릭스의 활용 등은 이번 여러가지 생각해 보아 대단히 공부가 되었습니다.
Reference
이 문제에 관하여(【Swift】NSUserDefaults를 편리하게 사용하는 몇 가지 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/taji-taji/items/edc1bad4709ce0e0a154
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【Swift】NSUserDefaults를 편리하게 사용하는 몇 가지 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/taji-taji/items/edc1bad4709ce0e0a154텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)