在Swift中实例化新Codable对象的最简单方法是什么?

时间:2019-01-22 05:40:38

标签: swift codable

我有一个Codable课:

class Task: Codable {
    var name: String
}

当我尝试实例化它时:

let newTask = Task()
allTasks.append(newTask)

它给了我错误:

  

调用中缺少参数'from'的参数

我所要做的就是将一个新对象(newTask)插入数组。最简单的方法是什么?

5 个答案:

答案 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("")
    }
}