LoginSignup
7
7

More than 5 years have passed since last update.

NSUserDefaultsを便利にする。

Last updated at Posted at 2016-09-27

NSUserDefaultsが不便

今のNSUserDefaultsの不満
Objectを取り出して → nilチェックして → キャストして → やっと使える。
つまり 

//==================================
//保存時
let defaults = NSUserDefaults()
defaults.setObject("Hello World",forKey:"sample")
//==================================
//読み込み時
let defaults = NSUserDefaults()
if let data = defaults.objectForKey("sample") as? String{
    ...
}


_人人人人人人人人_
> めんどくさい <
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

こうする

 let Info = RMInfo()

 let data = ["a","b","c"]
 Info.save(data,id:"obj")
=========================================
 let object = Info.load([String].self,id:"obj")//["a","b","c"]

 object.count //3

Info.load(String.self,"sample")//"" 
//保存された値がない場合は,Intなら0,Stringなら"",Arrayなら[]を返す。


 

実装

import UIKit

protocol defaultValueProtocol {
    associatedtype U
    static var defaultValue:U{get}
}

class RMInfo: NSObject {
    private var defaults = NSUserDefaults()

    func load<T: defaultValueProtocol>(type:T.Type,id:String)->T.U{
        if let object = defaults.objectForKey(id) as? T.U{
            return object
        }else{
            return T.defaultValue
        }
    }
    func save(object:AnyObject,id:String){
        defaults.setObject(object, forKey: id)
        defaults.synchronize()
    }
    func resetByType<T :defaultValueProtocol>(type:T.Type){
        let dict = defaults.dictionaryRepresentation()
        for key in dict.keys {
            if defaults.objectForKey(key) is T {
                defaults.removeObjectForKey(key)
            }
        }
        defaults.synchronize()
    }
    func resetByContainsName(containsName:String){
        let dict = defaults.dictionaryRepresentation()
        for key in dict.keys {
            if key.containsString(containsName){
                defaults.removeObjectForKey(key)
            }
        }
        defaults.synchronize()
    }
    func resetAll(){
        let dict = defaults.dictionaryRepresentation()
        for key in dict.keys {
            defaults.removeObjectForKey(key)
        }
        defaults.synchronize()
    }
}


extension Int:defaultValueProtocol{
    typealias U = Int
    static var defaultValue: Int.U{
        return 0
    }
}
extension Bool:defaultValueProtocol{
    typealias U = Bool
    static var defaultValue: Bool.U{
        return false
    }
}
extension Double:defaultValueProtocol{
    typealias U = Double
    static var defaultValue: Double.U{
        return 0.0
    }
}
extension Float:defaultValueProtocol{
    typealias U = Float
    static var defaultValue: Float.U{
        return 0.0
    }
}
extension CGFloat:defaultValueProtocol{
    typealias U = CGFloat
    static var defaultValue: CGFloat.U{
        return 0.0
    }
}
extension String:defaultValueProtocol{
    typealias U = String
    static var defaultValue: String.U{
        return ""
    }
}
extension Array :defaultValueProtocol{
    typealias U = Array
    static var defaultValue: Array.U{
        return []
    }
}
extension Dictionary :defaultValueProtocol{
    typealias U = Dictionary
    static var defaultValue: Dictionary.U{
        return [:]
    }
}
extension NSURL: defaultValueProtocol{
    typealias U = NSURL
    static var defaultValue: NSURL.U{
        return NSURL()
    }
}

他にも保存したい型があるなら

extension 保存したい型:defaultValueProtocol{
    typealias U = 保存したい型
    static var defaultValue: 保存したい型.U{
        return デフォルトの値
    }
}

で追加可能

RM

Swiftのジェネリクスが便利すぎて惚れそう。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7