我有一个Codable课:
class Task: Codable {
var name: String
}
当我尝试实例化它时:
let newTask = Task()
allTasks.append(newTask)
它给了我错误:
调用中缺少参数'from'的参数
我所要做的就是将一个新对象(newTask)插入数组。最简单的方法是什么?
答案 0 :(得分:0)
您的Task
类没有提供自己的初始化程序,因此它获得了Codable
协议(它是从Decodable
协议中定义)中定义的。
添加自己的带有init
参数的显式name
或将类更改为结构。无论哪种方式,您都需要通过传入名称值来创建Task
,以便可以初始化name
属性。
这些都不解决您发布的代码不使用Codable
的事实,因此也许您的类(或结构)不需要遵循Codable
。
答案 1 :(得分:0)
您可以从NSObject继承初始化程序:
class Task: NSObject, Codable {
var name: String = ""
}
let newTask = Task()
如果您不想继承NSObject,则只需创建自己的初始化程序即可:
class Task: Codable {
var name: String?
init() {
}
}
如果您不想将name
设为可选(或将其设置为默认值),则必须在init()中对其进行初始化,例如:
class Task: Codable {
var name: String
init(withName name: String) {
self.name = name
}
}
let newTask = Task(withName: "ikevin8me")
答案 2 :(得分:0)
Task
类未提供用于初始化对象的任何初始化程序,这就是为什么它采用Codable
协议的初始化程序,而是提供了自己的初始化程序来初始化对象的原因。
用法:
1.With Class
class Task: Codable {
var name: String
init(_ name : String) {
self.name = name
}
}
var task = Task("Jarvis")
2。使用struct:
struct Task: Codable {
var name: String
}
let task = Task(name: "jarvis")
答案 3 :(得分:0)
另一种解决方案是使用struct
struct Task: Codable {
var name: String
}
let task = Task(name: "myname")
答案 4 :(得分:0)
我不会为该属性分配默认值,而是实现预期的init方法和不带任何参数或具有创建“空”任务的工厂方法的便捷变体
这是两个选项的代码
class Task: Codable {
var name: String
init(_ name: String) {
self.name = name
}
convenience init() {
self.init("")
}
static func emptyTask() -> Task {
return Task("")
}
}