Swift 可编码CoreData模型因“无法识别的选择器发送到实例”而崩溃`
因此,我正在尝试将我的模型类与NSManagedObject(用于CoreData持久化)和Codable(用于JSON序列化/反序列化)相一致。现在,我的JSON解码器在因错误崩溃之前,已经完成了大约一半的反序列化Swift 可编码CoreData模型因“无法识别的选择器发送到实例”而崩溃`,swift,core-data,unrecognized-selector,codable,Swift,Core Data,Unrecognized Selector,Codable,因此,我正在尝试将我的模型类与NSManagedObject(用于CoreData持久化)和Codable(用于JSON序列化/反序列化)相一致。现在,我的JSON解码器在因错误崩溃之前,已经完成了大约一半的反序列化 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[Land setGun::]:未识别的选择器发送到实例0x60400028f780' 我一直在遵循这里找到的两个模型协议的一致性指南,我意识到抛出错误是因为(如果错误可信的话)Lan
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[Land setGun::]:未识别的选择器发送到实例0x60400028f780'
我一直在遵循这里找到的两个模型协议的一致性指南,我意识到抛出错误是因为(如果错误可信的话)Land类没有“setGun”方法。让我吃惊的是
A) 当我解码Land类JSON时,错误不会发生(它可以毫无问题地处理),最后一个要命中的断点实际上是在Sea类的JSON解码器中
B) Land类确实有一个“setGun”方法(我在类中声明了一个占位符方法,以防它与自动生成的CoreData代码有关)
我的土地类别代码如下:
import Foundation
import CoreData
@objc(Land)
class Land : NSManagedObject, Equipment {
var type = EquipmentType.LAND
enum CodingKeys: String, CodingKey {
case id
case name
case desc = "description"
case groupIconUrl
case individualIconUrl
case photoUrl
case primaryWeapon
case secondaryWeapon
case atgm
case armor
case speed
case auto
case weight
}
required convenience init(from decoder: Decoder) throws {
guard let context = decoder.userInfo[CodingUserInfoKey.context!] as? NSManagedObjectContext else { fatalError() }
guard let entity = NSEntityDescription.entity(forEntityName: "Land", in: context) else { fatalError() }
self.init(entity: entity, insertInto: context)
let container = try! decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decode(Int64.self, forKey: .id)
self.name = try container.decodeIfPresent(String.self, forKey: .name)
self.desc = try container.decodeIfPresent(String.self, forKey: .desc)
self.groupIconUrl = try container.decodeIfPresent(String.self, forKey: .groupIconUrl)
self.individualIconUrl = try container.decodeIfPresent(String.self, forKey: .individualIconUrl)
self.photoUrl = try container.decodeIfPresent(String.self, forKey: .photoUrl)
self.primaryWeapon = try container.decodeIfPresent(Gun.self, forKey: .primaryWeapon)
self.secondaryWeapon = try container.decodeIfPresent(Gun.self, forKey: .secondaryWeapon)
self.atgm = try container.decodeIfPresent(Gun.self, forKey: .atgm)
self.armor = try container.decode(Int64.self, forKey: .armor)
self.speed = try container.decode(Int64.self, forKey: .speed)
self.auto = try container.decode(Int64.self, forKey: .auto)
self.weight = try container.decode(Int64.self, forKey: .weight)
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(name, forKey: .name)
try container.encode(desc, forKey: .desc)
try container.encode(groupIconUrl, forKey: .groupIconUrl)
try container.encode(individualIconUrl, forKey: .individualIconUrl)
try container.encode(photoUrl, forKey: .photoUrl)
try container.encode(primaryWeapon, forKey: .primaryWeapon)
try container.encode(secondaryWeapon, forKey: .secondaryWeapon)
try container.encode(atgm, forKey: .atgm)
try container.encode(armor, forKey: .armor)
try container.encode(speed, forKey: .speed)
try container.encode(auto, forKey: .auto)
try container.encode(weight, forKey: .weight)
}
public func setGun(gun: Gun){}
}
我的CoreData数据模型也在下面的屏幕上显示:
最后,如果所有这些还不足以诊断出哪里出了问题,您可以自由地克隆存储库,并从以下公共github存储库本地运行它:您的问题在这行的
Air.swift
文件中
我真的不知道为什么不在Air文件解码器上解码枪
self.gun = try container.decodeIfPresent(Gun.self, forKey: .gun)
self.agm = try container.decodeIfPresent(Gun.self, forKey: .agm)
self.aam = try container.decodeIfPresent(Gun.self, forKey: .aam)
self.asm = try container.decodeIfPresent(Gun.self, forKey: .asm)
注释掉这些行(并且
self.天花=尝试container.decode(Int64.self,forKey:.天花)
允许它编译和运行。但我需要Air模型具有这些属性才能工作。知道为什么它可能没有解码吗?或者为什么它会为实际发生的Land类而不是Air类抛出错误吗?我找到了!在Air.swift文件中我有一行guard let entity=NSEntityDescription.entity(forEntityName:“Land”,in:context)else{fatalError()}
。将“Land”替换为“Air”修复了它。谢谢!