如何获取一个变量来包装 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)

让我感到困惑的是,在这种情况下,如果您注意到的话,我不会将值设置回来。我只是使用 removeAtIndexinsert,它们不会在任何地方调用 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 部分找到有关计算属性的更多信息