- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我知道有几个与此类似的问题,它们往往都围绕着未正确遵守协议(protocol)的类展开,但这不应该是这里的直接问题。
以下是目前给我这个问题的代码的浓缩版:
enum Binary: Int {
case a = 0
case b = 1
case c = 9
}
final class MyClass: NSCoder {
var string: String?
var date: Date?
var binary: Binary = .c
override init() { }
enum CodingKeys: CodingKey {
case string, date, binary
}
}
extension MyClass: Codable {
convenience init(from decoder: Decoder) throws {
self.init()
let values = try decoder.container(keyedBy: CodingKeys.self)
string = try values.decode(String.self, forKey: .string)
date = try values.decode(Date.self, forKey: .date)
binary = try Binary(rawValue: values.decode(Int.self, forKey: .binary)) ?? .c
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(string, forKey: .string)
try container.encode(date, forKey: .date)
try container.encode(binary.rawValue, forKey: .binary)
}
}
我创建了以下类,然后尝试调用 MyClass
并将其写入和读取到 UserDefaults
:
class MyClassController {
private let myClass: MyClass
init() {
self.myClass = MyClass()
self.myClass.string = "string"
self.myClass.date = Date()
self.myClass.binary = .a
}
func writeMyClass() {
let encodedData = NSKeyedArchiver.archivedData(withRootObject: myClass)
UserDefaults.standard.set(encodedData, forKey: String(describing: MyClass.self))
}
func readMyClass() {
if let decoded = UserDefaults.standard.object(forKey: String(describing: MyClass.self)) as? Data,
let myClass = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as? MyClass {
print("string: \(myClass.string ?? "nil") date: \(myClass.date ?? Date()) binary: \(myClass.binary)")
}
}
}
不过,一旦调用 writeMyClass 函数,我就会收到此错误:
[DemoDecoder.MyClass encodeWithCoder:]: unrecognized selector sent to instance #blahblah#
我也试过两件事:
func encode(with aCoder: NSCoder)
添加到 MyClass
MyClass
& CodingKeys
和 init/encode 函数中删除了所有属性最佳答案
你有很多不匹配的尝试和各种编码/解码机制。
NSKeyedArchiver
和 NSKeyedUnarchiver
要求所有涉及的类型都符合 NSCoding
协议(protocol)。这是来自 Objective-C 框架的旧机制。
协议(protocol) Codable
、Encoder
和 Decoder
是 Swift 4 的新协议(protocol)。此类数据类型应与 Swift 编码器和解码器一起使用,例如作为 JSONEncoder
和 JSONDecoder
或 PropertyListEncoder
和 PropertyListDecoder
。
我建议您删除对 NSCoder
的引用并删除对 NSKeyedArchiver
和 NSKeyedUnarchiver
的使用。由于您已经实现了 Codable
协议(protocol),因此请使用合适的 Swift 编码器和解码器。在您的情况下,您想使用 PropertyListEncoder
和 PropertyListDecoder
。
完成后,您可能应该将 MyClass
更改为 struct
而不是 class
。
您还应该避免使用 UserDefaults
来存储数据。而是将编码数据写入 plist 文件。
关于ios - 符合 Codable 协议(protocol)的类因 encodeWithCoder : unrecognized selector sent to instance 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47659107/
您好,我在我的 ios 应用程序中使用 GoogleMaps,并且有一部分我必须在 CoreData 中保存 map 标记位置.我正在使用代码 GMSMarker *marker = [GMSMark
假设我有一个对象 Person。(我知道 Person 有语法错误。请忽略这些错误。) class Person: NSObject, NSCoding { var name : String
我有一个对象,其属性可能为 nil。我应该如何在 encodeWithCoder(和 decodeWithCoder)中实现它? - (void)encodeWithCoder:(NSCoder *)
我正在尝试使用 NSCoding 来保存和恢复应用程序状态。我以前没用过。 在我的应用程序中,协议(protocol)方法 encodeWithCoder 和 initWithCoder 从未被调用。
我第一次使用编码是为了将数据保存在我的应用程序之外。我一直在看的例子说要为自定义类调用 [super encodeWithCoder:coder]; 。 我有一个扩展 NSObject 的类,但收到下
我遇到了这个错误,但我不知道如何修复它。我刚刚添加了来自 Apple 示例 (LazyTableImages) 的延迟加载以及来自照片位置示例项目的 UIImageToDataTransformer
这将保存一个数组(我认为)。 - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:myArray forKey
我正在尝试用restkit中的值填充字典。我在restEngine.m中使用NSUserDefaults保存字典。 NSDictionary *dict = [mappingResult dicti
我在重写 encodeWithCoder: 方法时遇到了一个非常奇怪的崩溃。你可以在 https://github.com/reidmain/FDModel/blob/193b0661f7ab1ce6
我们正在开发一款可以将大量内容保存到 Core Data 中的应用程序。它保存的东西主要是NSDate NSNumber & NSString 但它也将很多图片和视频保存为NSData。我正在尝试更改
我知道当你编写实现 NSCoding 的对象的子类的 initWithCoder 方法时,你必须调用 super initWithCoder(而不是 super init),但是我必须在encodeW
尝试使用 NSCoder 时出现错误 Player.swift: class Player: NSObject, NSCoding { private var _playerName: Str
我的自定义对象使用以下方法符合 NSCoding 协议(protocol) required init(coder decoder: NSCoder) { super.init() c
这个问题已经有答案了: NSKeyedUnarchiver unarchiveObjectWithData:data returns non nil object but with nil prope
我正在尝试保存一个名为 queueArray 的 NSMutableArray,以便在应用程序退出后可以再次加载它。我使用了一些教程来帮助我前进,这是我想出的代码。问题似乎是“initWithCode
我有一个自定义类 MyClass,它基本上由几个 NSMutableArrays 组成,没有其他变量。我有一个实体 MyEntity,它有一个属于 MyClass 的 ivar。当我尝试保存实体时,我
错误: Assertion failure in -[UICGColor encodeWithCoder:], /SourceCache/UIKit/UIKit-2372/UIColor.m:1191
我有这个错误。我知道有些人已经在其他线程上回答了这个问题,但给出的答案似乎对我不起作用。 这是我的代码: 人物类: class People: NSObject, NSCoding { var
我知道有几个与此类似的问题,它们往往都围绕着未正确遵守协议(protocol)的类展开,但这不应该是这里的直接问题。 以下是目前给我这个问题的代码的浓缩版: enum Binary: Int {
我在实现 NSCoding 时遇到了问题。这是我的用户类代码: public class User: NSCoder { ... NSCoding 方法: 解码器: required public i
我是一名优秀的程序员,十分优秀!