データを NSUserDefaults に保存する一般的な方法を書き込もうとしています。私が直面している問題は、タイプをNSUserDefaults.standardUserDefaults().setValue(value, forKey: key)
取り込んでAnyObject?
、プロトコルでタイプを設定するとString
、 、 などはオブジェクトではないため、 にBool
マップされないことです。AnyObject?
とにかく、各タイプの拡張機能を実装することなく、このコードを機能させるにはどうすればよいでしょうか? 手伝ってくれてありがとう!
protocol UserDefaultUtility {
typealias UserDefaultType
var key: String { get }
func getDefault() -> UserDefaultType?
func setDefault(value: UserDefaultType?)
func removeDefault()
}
extension UserDefaultUtility {
func getDefault() -> UserDefaultType? {
return NSUserDefaults.standardUserDefaults().valueForKey(key) as? UserDefaultType
}
// Doesn't work-- Cannot convert value of type 'Self.UserDefaultType' to expected argument type 'AnyObject?'
/*
func setDefault(value: UserDefaultType) {
NSUserDefaults.standardUserDefaults().setValue(value, forKey: key)
NSUserDefaults.standardUserDefaults().synchronize()
}
*/
func removeDefault() {
NSUserDefaults.standardUserDefaults().removeObjectForKey(key)
NSUserDefaults.standardUserDefaults().synchronize()
}
}
// I have to do this instead to get it to work for any type I want to save to user defaults
extension UserDefaultUtility where UserDefaultType == String {
func setDefault(value: String?) {
NSUserDefaults.standardUserDefaults().setValue(value, forKey: key)
NSUserDefaults.standardUserDefaults().synchronize()
}
}
編集 1
実装
/**
Strings stored in UserDefaults are accessed by this utility. Note that the String in the enum header is there to tell the enum that it's raw value is a String.
*/
enum StringUserDefaulstUtility: String, UserDefaultsUtility {
typealias UserDefaultType = String
case UserFirstName = "userFirstName"
case UserLastName = "userLastName"
var key: String {
get {
return self.rawValue
}
}
}
enum NSDateUserDefaultsUtility: String, UserDefaultsUtility {
typealias UserDefaultType = NSDate
case TokenExpiration = "tokenExpiration"
var key: String {
get {
return self.rawValue
}
}
}
使用事例
func someUselessFunc() {
// Sets the user's first name
StringUserDefaulstUtility.UserFirstName.setDefault("Matt")
// Gets the user's first name
StringUserDefaulstUtility.UserFirstName.getDefault()
// Removes the user's first name
StringUserDefaulstUtility.UserFirstName.removeDefault()
}