gpt4 book ai didi

如果使用 setter 和 getter,则 Swift Decode 不起作用

转载 作者:行者123 更新时间:2023-11-30 10:59:25 30 4
gpt4 key购买 nike

过去几个晚上我一直在努力解决一个问题,但一无所获。

问题总结如下:如果我的类中有标准公共(public)属性并对数据进行编码然后存储在核心数据中,则一切正常。如果我随后修改该类,使其具有显式定义的 getter 和 setter(使用私有(private)变量),那么编码似乎不起作用,因此从 Core Data 取回数据时解码会失败。

这是我遇到问题的类(class):

import Foundation

class MapLocation: NSObject, NSCoding {

// MARK: - Properties

// If section 1 below is used (and section 2 commented out) everything works fine. If section 2 below is used (and section 1 commented out) encode seems to fail for core data.

// Section 1 Start

public var row: Int!
public var column: Int!

// Section 1 End

// Section 2 Start

public var row: Int {
get {
return self._row
} set {
self._row = newValue
landType = MapLayout.landTypeForLocation(row: _row, column: _column)
}
}
public var column: Int {
get {
return self._column
} set {
self._column = newValue
landType = MapLayout.landTypeForLocation(row: _row, column: _column)
}
}

// MARK: - Instance variables

private var _row: Int = 0
private var _column: Int = 0

// Section 2 End

public var landType: LandType!

// MARK: - Constructors

override init() {

super.init()

// Game Starting location
self.row = 3
self.column = 4

self.landType = MapLayout.landTypeForLocation(row: self.row, column: self.column)
}

required init?(coder aDecoder: NSCoder) {

super.init()

guard let row = aDecoder.decodeObject(forKey: PropertyKey.playerLocationRow) as? Int,
let column = aDecoder.decodeObject(forKey: PropertyKey.playerLocationColumn) as? Int
else {
print("SVL Error: decoding failed MapLocation")
return nil
}

self.row = row
self.column = column

self.landType = MapLayout.landTypeForLocation(row: row, column: column)
}

func encode(with aCoder: NSCoder) {

aCoder.encode(row, forKey: PropertyKey.playerLocationRow)
aCoder.encode(column, forKey: PropertyKey.playerLocationColumn)
}
}

在一个单独的类中,我存储“父”类“Player”,该类将上述类作为属性:

   playerEntity.properties = try NSKeyedArchiver.archivedData(withRootObject: player, requiringSecureCoding: false) ...

然后使用以下方法从 Core Data 中检索保存的值:

   if let returnPlayer = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(playerPropertiesData) as? Player {...

当第 2 部分取消注释时,我在控制台日志中收到以下内容:“SVL 错误:解码失败的 map 位置”这是因为解码器 init 方法的“guard let row =”部分无法解码对象,因此调用了异常。

有趣的是,如果我使用代码的第 1 部分“保存”到 coredata,然后使用代码的第 2 部分“加载”数据,则一切正常。这让我认为编码才是问题所在(即使问题出现在解码点)。

很奇怪,这么小的变化会导致它通过/失败,但希望有人以前经历过这种异常情况。谢谢。

最佳答案

事实证明,将私有(private)实例变量(_row 和 _column)设置为 = 0 破坏了一切。

更改了这一点,一切正常。

发布这个答案是为了防止其他人像我一样连续两个晚上都抓狂:-)

关于如果使用 setter 和 getter,则 Swift Decode 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53562694/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com