ios - 使用所需的便利初始化解码时如何修复“调用中的额外参数”?(编码器:)?
问题描述
我对应用程序开发相对较新,并且正在尝试将持久性添加到使用 SwiftUI 编写的家庭作业管理应用程序中。我在我的“UserData”类中实现 NSCoding,并且能够毫无问题地创建编码函数,但是在我设置解码函数后,我在 self.init( ) 线。我的代码到底有什么问题?
class UserData: NSObject, NSCoding, ObservableObject {
// MARK:- Properties
@Published var assignments: [Assignment]
@Published var courses: [Course] = []
@Published var username: String = ""
@Published var appState: AppState = AppState(willPresentSplashScreen: false)
...
// MARK:- NSCoding
func encode(with coder: NSCoder) {
coder.encode(assignments, forKey: PropertyKey.assignments)
coder.encode(courses, forKey: PropertyKey.courses)
coder.encode(username, forKey: PropertyKey.username)
coder.encode(appState, forKey: PropertyKey.appState)
}
required convenience init?(coder decoder: NSCoder) {
let assignments = decoder.decodeObject(forKey: PropertyKey.assignments) as? [Assignment]
let courses = decoder.decodeObject(forKey: PropertyKey.courses) as? [Course]
let username = decoder.decodeObject(forKey: PropertyKey.username) as? String
let appState = decoder.decodeObject(forKey: PropertyKey.appState) as? AppState
self.init(assignments: assignments, courses: courses, username: username, appState: appState)
}
}
解决方案
UserData
是一个类,与结构不同,类没有默认的成员初始化器。您需要创建一个接受这些参数的初始化程序。没有它,Swift 可以找到的最接近的初始化程序init()
是继承自的NSObject
——除了参数名称不匹配,因此会出错。
您需要创建按成员的初始化程序:
init(assignments: [Assignment], courses: [Course], username: String, appState: AppState) {
self.assignments = assignments
self.courses = courses
self.username = username
self.appState = appState
}
然后这会给你一个错误,你传递的参数init?(coder decoder: NSCoder)
需要被解包,因为你有可选项并且初始化器不期望可选项。
init?(coder decoder: NSCoder)
是一个失败的初始化器,所以nil
如果一切都不对,你可以返回:
required convenience init?(coder decoder: NSCoder) {
guard let assignments = decoder.decodeObject(forKey: PropertyKey.assignments) as? [Assignment],
let courses = decoder.decodeObject(forKey: PropertyKey.courses) as? [Course],
let username = decoder.decodeObject(forKey: PropertyKey.username) as? String,
let appState = decoder.decodeObject(forKey: PropertyKey.appState) as? AppState else {
return nil
}
self.init(assignments: assignments, courses: courses, username: username, appState: appState)
}
我可能会摆脱分配给的默认值courses
,username
并且appState
-您不需要它们,因为这些值将来自初始化程序
推荐阅读
- react-native - 如何在 TextInput React Native 中键入时隐藏标签
- android-studio - 如何从列表视图播放音乐文件
- angular - 如何对 ngx-formly 进行单元测试?
- java - 为什么我看到一条消息,找不到名为生成测试的运行配置
- json - .Net 6 和 RenderFragment 中的 Blazor DynamicComponent
- python - ORA-12571: TNS: WSL2 的数据包写入器失败
- mongodb - MongoDB - 从文档中删除一行
- java - 骆驼kafka主题中的spring-cloud-contract-verifier清理消息
- python - 如何将张量流数据集转换为特征字典的形式?
- sql - Hive SQL 嵌套查询使用相似列