- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
import UIKit
class Foo: NSObject, NSCoding {
var cx: [Character : Int]
init(cx: [Character : Int]) {
self.cx = cx
}
// MARK: - <NSCoding>
required convenience init(coder aDecoder: NSCoder) {
let cx = aDecoder.decodeObject(forKey: "cxKey") as! [Character : Int]
self.init(cx: cx)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(cx, forKey: "cxKey")
}
}
调用:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var foo = Foo(cx: ["C": 5, "X": 6])
let encodedData = NSKeyedArchiver.archivedData(withRootObject: foo)
print("encodedData: \(encodedData))")
if let foo1 = NSKeyedUnarchiver.unarchiveObject(with: encodedData) as? Foo {
print("cx = ", foo1.cx)
} else{
print("There is an issue")
}
}
}
Xcode 抛出错误:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[_SwiftValue encodeWithCoder:]: 无法识别的选择器发送到实例
最佳答案
原因
这是因为 cx
中的 Character
类型的键将被装箱为 _SwiftValue
对象,该对象将被发送 encodeWithCoder:
导致无法识别的选择器异常。
请参阅 SwiftValue.h 顶部的评论:
This implements the Objective-C class that is used to carry Swift values that have been bridged to Objective-C objects without special handling. The class is opaque to user code, but is
NSObject
- andNSCopying
- conforming and is understood by the Swift runtime for dynamic casting back to the contained type.
解决方案
如果您可以将 cx
的类型更改为 [String : Int]
,一切都会开箱即用(无双关语意)。
否则,您必须将 Foo.encode(with:)
中的 cx
转换为可以编码的内容(如 [String : Int]
,例如),反之亦然。
参见 How do I encode Character using NSCoder in swift?和 How do I encode enum using NSCoder in swift?对于一些代码。
关于ios - 如何编码 [字符 : Int] property using NSCoder in Swift 3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43299117/
我正在尝试通过 SymSpell 实现自动更正 我已经在容器应用程序中创建了字典,应该保存它并从键盘扩展读取它 字典中包含一个dictionaryItem对象,需要序列化才能被NSCoder保存 我试
我正在 Swift 中实现一个 Circle 类(UIView 的子类),它根据框架在其初始化程序中设置其 radius像这样传入 init(frame: CGRect): override init
这是我的代码: import Foundation class Person: NSObject, NSCoding { var name: String init(name: String) {
如何使用 NSCoder 来编码和解码自定义类型? 例如,如何将 NSCoder 与“STATE”实例一起使用,其中: typedef enum { ON, OFF } STATE; 最佳答案 您可以
所以,我是 iOS 新手,一直在使用在线教程来学习该平台。我正在使用的教程是在我使用 iOS 10 的同时使用 iOS 9 构建应用程序。因此,我遇到了标题问题。这是一些代码: CalendarEve
在下面的代码中,sharedInstance 方法中的属性从未正确设置,我不明白为什么。在我用存档器保存它之前,我似乎有正确的值。 #import "User.h" static User *
所以,我是 iOS 新手,一直在使用在线教程来学习该平台。我正在使用的教程是在我使用 iOS 10 时使用 iOS 9 构建应用程序。因此我遇到了标题问题。这是一些代码: CalendarEvent.
我正在开发 iphone 应用程序。 我使用 NSCoder。 我的应用程序.h #define ITEMS_KEY @"items" #define CATEGORIES_KEY @"categor
我正在开发一个 iPhone 应用程序,但我的共享单例类遇到了一些问题。我使用共享单例来存储两个变量int gameRuns 和 int totalScore每次用户加载应用程序时,“gamRuns”
当使用NSCoder和NSKeyedArchiver时,我知道数据是以二进制格式存储的。那么,存储文件最合适的文件扩展名是什么?许多教程都使用 .plist,但我相信这应该是文本属性列表 ~ 键/值对
尝试在另一个类(Swipe)中实例化使用 NSCoder 的类(SettingsView)时遇到问题。 SettingsView 类已经是目标 -C 类(FXBlurView) 的实例 我收到以下错误
我正在开发我的第一个 Swift iOS 应用程序,在序列化和保存从服务器获取 JSON 的对象时遇到问题。我正在使用Gloss ,一个轻量级 JSON 解析库,它定义了一个 Decodable 协议
我定义了一个具有 [String] 和 Float 属性的类,它在 NSCoder 的编码过程中工作正常,但在解码时总是失败。我在代码中添加了guard let,发现是Float $的问题。 我不知道
我有一个用户Class使用 saveuser()每当应用程序终止时方法。用户有两个 Arrays定制Classes该子类NSObject 。这是我的编码方法。 func encode(with aCo
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
当对象的属性在存档和取消存档过程之间发生变化时,我在使用 NSKeyedArchiver 和 NSKeyedUnarchiver 时遇到了一些麻烦。这是一个具体的例子: 我有一个类,比如说Task,它
这可能是一个幼稚的问题 - 但我想仔细检查以避免在 UIDocument 上浪费时间,如果它不符合我的要求的话。 背景:我有一个应用程序,我为其创建了一个简单的文件系统来将用户创建的文档保存为 pli
我有两个用于保存数据的模型类,我在解码数据时崩溃了。 第一类: class User: NSObject,NSCoding, Mappable { var authenticationToke
我基于此处的示例创建了 UILabel 的子类:UILabel doesn't show inputView .我正在尝试在子类化 UITableViewCell 的类中创建标签的实例。我遇到的问题是
我有一个对象,我必须使用 encodewithcoder 进行编码,但它是一个“长”数字,我不确定是否必须像简单的 int、int32 或 int64 那样对其进行编码。 Apple 的文档似乎对我来
我是一名优秀的程序员,十分优秀!