【Swift】NSUserDefaults를 편리하게 사용하는 몇 가지 방법

11700 단어 XcodeiOSSwift애플

소개


  • 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 , 제네릭스의 활용 등은 이번 여러가지 생각해 보아 대단히 공부가 되었습니다.

    좋은 웹페이지 즐겨찾기