我正在尝试重新编译 SwiftyUserDefaults( https://github.com/radex/SwiftyUserDefaults ) 以添加 Carthage 支持,但在尝试编译时我看到以下错误:
“NSUserDefaults”中不明确的类型名称“Proxy”
对于以下代码
public func ?= (proxy: NSUserDefaults.Proxy, @autoclosure expr: () -> Any) {
if !proxy.defaults.hasKey(proxy.key) {
proxy.defaults[proxy.key] = expr()
}
}
Run Code Online (Sandbox Code Playgroud)
和
在这种情况下,“代理”对于类型查找是不明确的
为了
public subscript(key: String) -> Proxy {
return Proxy(self, key)
}
Run Code Online (Sandbox Code Playgroud)
据我了解 - 问题出在类代理上,它嵌入在扩展中。
public extension NSUserDefaults {
class Proxy {
private let defaults: NSUserDefaults
private let key: String
private init(_ defaults: NSUserDefaults, _ key: String) {
self.defaults = defaults
self.key = key
}
// MARK: Getters
public var object: …Run Code Online (Sandbox Code Playgroud) 我得到了用户默认值,例如键"abc",它包含一个字符串.
存储在此密钥中的最后一个字符串是"aaa".
现在,我想为此密钥存储一个额外的值,但我不想删除最后一个值"aaa",因为我需要它.
我希望在第二个retreive中包含一个包含数组的字符串:["aaa","some_other_value","some_other_value2"...].
到目前为止,这是我的代码,用于存储用户默认值中的信息:
self.user_defaults.set(self.myTextField.text, forKey:"asd")
Run Code Online (Sandbox Code Playgroud)
这是获取数据的代码:
if let arr = user_defaults.string(forKey:"asd"){
print (arr)
}
Run Code Online (Sandbox Code Playgroud) 我试图模拟 UserDefaults 以便能够测试其行为。
在不破坏保存用户令牌密钥的实际计算属性的情况下,最好的方法是什么?
class UserDefaultsService {
private struct Keys {
static let token = "partageTokenKey"
}
//MARK: - Save or retrieve the user token
static var token: String? {
get {
return UserDefaults.standard.string(
forKey: Keys.token)
}
set {
UserDefaults.standard.set(
newValue, forKey: Keys.token)
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个登录视图控制器,用户可以在其中输入他们的首选项,例如他是否要激活某些UI功能.
我将这些存储为getter和setter直接访问的变量UserDefaults,以下是其中一个示例:
class Preferences {
static var likesSpaghetti : Bool {
set (likesSpaghetti) {
UserDefaults.standard.set(likesSpaghetti, forKey: "likesSpaghetti")
}
get {
return UserDefaults.standard.bool(forKey: "likesSpaghetti")
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,每当我想要设置其中任何一个时,我只需编写如下内容:
Preferences.likesSpaghetti = false
现在,我的问题是:每次用户轻拂开/关开关时我都可以设置这些变量,还是应该将首选项保持为局部变量,然后才设置:
Preferences.likesSpaghetti = spaghettiSwitch.isOn
当用户离开时loginViewController?每次访问都是UserDefault即时快速的吗?或是它是否滞后,应该仁慈地使用?
关闭这个问题后编辑:所以我学会了不要过早地优化,并且它可能在几十个元素的范围内.所以我应该没事.每次用户修改任何内容时我都会更新,以便我的代码更容易阅读和维护.
感谢大家!