【发布时间】:2022-01-11 04:17:23
【问题描述】:
对于我的问题,我在 GitHub 上准备了 a simple SwiftUI project。
一个后端向我的应用发送以下 JSON 数据,代表一个 15 x 15 字母的游戏:
{
"gid":266,
"letters":[
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,"H", null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,"U", null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,"E", null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]
],
"values":[
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null, 4, null,null,null,null,null,null,null],
[null,null,null,null,null,null,null, 1, null,null,null,null,null,null,null],
[null,null,null,null,null,null,null, 1, null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]
],
"tiles":[
{"col": 8, "row": 7, "value": 1, "letter": "E"},
{"col": 7, "row": 7, "value": 1, "letter": "U"},
{"col": 6, "row": 7, "value": 4, "letter": "H"}
]
}
您可以看到letters 和values 是String? 和Int? 的二维数组,这就是我在用于JSON 解析的GameModel.swift 中定义它们的方式:
struct GameModel: Codable, Identifiable {
var id: Int32 { gid }
let gid: Int32
let letters: [[String?]]
let values: [[Int32?]]
let tiles: [TileModel]? // the previous move as an array
// create a new Core Data entity and copy the properties
func toEntity(viewContext: NSManagedObjectContext) -> GameEntity {
let gameEntity = GameEntity(context: viewContext)
gameEntity.gid = self.gid
gameEntity.letters = self.letters
gameEntity.values = self.values
gameEntity.tiles = self.tiles
return gameEntity
}
}
struct TileModel: Codable {
let col: Int
let row: Int
let value: Int
let letter: String
}
我正在尝试使用 Transformable 核心数据类型来解析它们,因此我已将这 3 行添加到 Persistence.swift
let container: NSPersistentContainer
init(inMemory: Bool = false) {
ValueTransformer.setValueTransformer(ValuesToDataTransformer(), forName: .valuesToDataTransformer)
ValueTransformer.setValueTransformer(LettersToDataTransformer(), forName: .lettersToDataTransformer)
ValueTransformer.setValueTransformer(TilesToDataTransformer(), forName: .tilesToDataTransformer)
container = NSPersistentContainer(name: "TransApp")
我还添加了 3 个文件:
我的问题是我的自定义 ValueTransformer 子类无法编译。
错误是:
静态方法 'unarchivedObject(ofClass:from:)' 要求 '[[Int32?]]' 符合 'NSCoding'
其他 2 个也类似。
【问题讨论】:
-
关于“没有成员”错误,您需要为每个转换器创建一个 NSValueTransformerName 实例。请参阅this 文档页面上的示例