UserDefaults不存储自定义Swift类属性

UserDefaults不存储自定义Swift类属性,swift,xcode,Swift,Xcode,我正在使用中建议的方法 存储自定义类对象。但是属性值似乎没有保存-可能是因为类初始化覆盖了存储值?或者更新后的值从未保存 class Test : Codable { var testedValues: float init () { testedValues = 0.0 } } var myTest = Test() // retrieve if let testData = UserDefaults.standard.data(forKey: "myTest"

我正在使用中建议的方法
存储自定义类对象。但是属性值似乎没有保存-可能是因为类初始化覆盖了存储值?或者更新后的值从未保存

class Test : Codable {

  var testedValues: float

  init () {
    testedValues = 0.0
  }
}

var myTest = Test()

// retrieve 
if let testData = UserDefaults.standard.data(forKey: "myTest"),
 let myTest = try? JSONDecoder().decode(Test.self, from: testData) {
}

//testValues is 0.0 each time the app starts up
print (myTest.testValues) 

myTest.testValues += 1.0

//save in UserDefaults
if let encoded = try? JSONEncoder().encode(myTest) {
  UserDefaults.standard.set(encoded, forKey: "myTest")
}

您已成功保存自定义类及其属性。这里的错误是检索存储值并打印新创建的实例。不要对两个实例使用相同的名称myTest。将检索到的值存储在
myTest

if let testData = UserDefaults.standard.data(forKey: "myTest"),
    let storedMyTest = try? JSONDecoder().decode(Test.self, from: testData) {
        self.myTest = storedMyTest
}
若要在用户默认值中自动保存TestedValue,请使用如下计算变量

class Test: Codable {
    var testedValues: Double {
        didSet {
            //save in UserDefaults
            if let encoded = try? JSONEncoder().encode(self) {
                UserDefaults.standard.set(encoded, forKey: "myTest")
            }
        }
    }
    init () {
        testedValues = 0.0
    }
}

切勿将
try?
JSONDecoder
jsonecoder
一起使用。在
do/catch
中使用
try
,并确保在
catch
中打印(错误),以便您可以查看错误是什么(如果有)。它起作用了。非常感谢。还有一个问题——因为我在iOS应用程序中是新手——testValues会在一些地方更新,包括一些函数,但我不确定每次更新testValues时保存是否是个好主意。是否有合适的位置(例如在viewController中)放置保存代码,并且仍然保证在用户退出应用程序时保存值?