如何获取一个变量来包装 NSUserDefaults 对象?
How to get a variable to wrap NSUserDefaults objects?
我想抽象出底层存储,所以我想为 NSUserDefaults 值创建一个 getters/setters 的变量。在下面,我能够像这样使用 getter 来做到这一点,甚至可以处理默认值:
public let userStorage = NSUserDefaults(suiteName: "group.testabcxyz")
public var categories: [String] {
get {
// Get from storage or default
if userStorage?.objectForKey("category") == nil {
// Set defaults
userStorage?.setObject([
"Weight",
"Length",
"Volume"
], forKey: "category")
userStorage?.synchronize()
}
return userStorage?.objectForKey("category") as! [String]
}
set {
// Set new value in storage
userStorage?.setObject(newValue, forKey: "category")
userStorage?.synchronize()
}
}
现在我在重新排列项目时无法将数组同步回 userStorage
,例如执行以下操作:
var itemToMove = categories[sourceIndexPath.row]
// Move record in array
categories.removeAtIndex(sourceIndexPath.row)
categories.insert(itemToMove, atIndex: destinationIndexPath.row)
让我感到困惑的是,在这种情况下,如果您注意到的话,我不会将值设置回来。我只是使用 removeAtIndex
和 insert
,它们不会在任何地方调用 userStorage?.synchronize()
,因为我没有真正 set
任何东西。我正在尝试做的事情是否可能或对此有任何影响?
属性 setters 有一个名为 newValue
的隐式变量,毫不奇怪,它表示分配给 属性 的新值:
public let userStorage = NSUserDefaults(suiteName: "group.testabcxyz")
public var categories: [String] {
get {
// Get from storage or default
if userStorage?.objectForKey("category") == nil {
// Set defaults
userStorage?.setObject([
"Weight",
"Length",
"Volume"
], forKey: "category")
userStorage?.synchronize()
}
return userStorage?.objectForKey("category") as! [String]
}
set {
// Set new value in storage
userStorage?.setObject(newValue, forKey: "category")
userStorage?.synchronize()
}
}
这适用于您的示例用法,因为当您调用 categories.removeAtIndex(sourceIndexPath.row)
时,它会改变数组并导致调用 setter。
您可以在 Swift 编程语言
的 Computed Properties 部分找到有关计算属性的更多信息
我想抽象出底层存储,所以我想为 NSUserDefaults 值创建一个 getters/setters 的变量。在下面,我能够像这样使用 getter 来做到这一点,甚至可以处理默认值:
public let userStorage = NSUserDefaults(suiteName: "group.testabcxyz")
public var categories: [String] {
get {
// Get from storage or default
if userStorage?.objectForKey("category") == nil {
// Set defaults
userStorage?.setObject([
"Weight",
"Length",
"Volume"
], forKey: "category")
userStorage?.synchronize()
}
return userStorage?.objectForKey("category") as! [String]
}
set {
// Set new value in storage
userStorage?.setObject(newValue, forKey: "category")
userStorage?.synchronize()
}
}
现在我在重新排列项目时无法将数组同步回 userStorage
,例如执行以下操作:
var itemToMove = categories[sourceIndexPath.row]
// Move record in array
categories.removeAtIndex(sourceIndexPath.row)
categories.insert(itemToMove, atIndex: destinationIndexPath.row)
让我感到困惑的是,在这种情况下,如果您注意到的话,我不会将值设置回来。我只是使用 removeAtIndex
和 insert
,它们不会在任何地方调用 userStorage?.synchronize()
,因为我没有真正 set
任何东西。我正在尝试做的事情是否可能或对此有任何影响?
属性 setters 有一个名为 newValue
的隐式变量,毫不奇怪,它表示分配给 属性 的新值:
public let userStorage = NSUserDefaults(suiteName: "group.testabcxyz")
public var categories: [String] {
get {
// Get from storage or default
if userStorage?.objectForKey("category") == nil {
// Set defaults
userStorage?.setObject([
"Weight",
"Length",
"Volume"
], forKey: "category")
userStorage?.synchronize()
}
return userStorage?.objectForKey("category") as! [String]
}
set {
// Set new value in storage
userStorage?.setObject(newValue, forKey: "category")
userStorage?.synchronize()
}
}
这适用于您的示例用法,因为当您调用 categories.removeAtIndex(sourceIndexPath.row)
时,它会改变数组并导致调用 setter。
您可以在 Swift 编程语言
的 Computed Properties 部分找到有关计算属性的更多信息