将 UserDefaults 移动到数组

Moving UserDefaults to an array

我 运行 在尝试将用户默认数组移动到第二个数组时遇到问题,因此我可以将它加载到 table 视图中。

我的 userdefault 只是一个 Int 类型的字段。我能够将数据存储在 UD 中,当我显示它时它会显示可选值: [176, 177]

我在视图的顶层声明了以下内容:

let defaults = UserDefaults.standard
   
var intArray = [[Int:Any]]()

在 viewDidLoad 中我有以下内容:

override func viewDidLoad() {
        super.viewDidLoad()
      intArray = defaults.array(forKey: "Favorites") as? [[Int: Any]] ?? []
      print(defaults.array(forKey: "Favorites"))
   }

intArray 始终为空,但当我打印 Favorites UserDefault 时,它会像上面那样显示。

显然,我在这里做错了;任何帮助将不胜感激。

将值存储到用户默认值

UserDefaults.standard.set([1, 2, 3], forKey: "TestArrayUD")
print(UserDefaults.standard.array(forKey: "TestArrayUD")) // Give Optional array eg: Optional([1, 2, 3])
    

读取无可选值

一种方法是使用 UserDefaults.standard.array,如下例所示

    if let _intArray = UserDefaults.standard.array(forKey: "TestArrayUD") {
        print(_intArray) // Eg: [1, 2, 3]
    }

您可以使用像这样方便的扩展来简化对 UserDefaults 的读取和写入。

import Foundation

extension UserDefaults {
    var favorites: [Int] {
        get { self.array(forKey: #function) as? [Int] ?? [] }
        set { self.set(newValue, forKey: #function) }
    }
}

如果您的应用中存储了旧数据并且您不想删除它,您可以简单地用您的密钥替换上面 get / set 中的 #function "Favorites".

以下是您如何使用上述存储空间 -

let defaults = UserDefaults.standard
defaults.favorites = [1,2,3,4,5] // save

let favorites = defaults.favorites // read
print(favorites) // [1, 2, 3, 4, 5]

现在,您正在尝试解码以 Int 作为键并以 Any 作为值的字典数组(外括号组是数组,内括号是:Dictionary).

如果您将所有出现的 [[Int:Array]] 替换为 [Int],您的代码将有效。