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

7gs2gvoe  于 2023-02-28  发布在  Swift
关注(0)|答案(6)|浏览(190)

我有一个Codable类:

class Task: Codable {
    var name: String
}

当我尝试示例化它时:

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

它给了我错误:
调用中缺少参数“from”的自变量
我只想在数组中插入一个新对象(newTask),最简单的方法是什么?

njthzxwz

njthzxwz1#

您可以从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")
a0zr77ik

a0zr77ik2#

还有一种解决方案是使用struct

struct Task: Codable {
    var name: String
}

let task = Task(name: "myname")
qoefvg9y

qoefvg9y3#

您的Task类不提供自己的初始化器,因此它获取Codable协议中定义的初始化器(它从Decodable协议获取)。
添加您自己的显式init(采用name参数)或将类更改为结构。无论采用哪种方法,都需要通过传入name值来创建Task,以便可以初始化name属性。
所有这些都没有解决您发布的代码没有使用Codable的问题,因此您的类(或结构)可能不需要符合Codable

a8jjtwal

a8jjtwal4#

Task类没有提供任何初始化器来初始化一个对象,这就是为什么它从Codable协议中获取初始化器,提供你自己的初始化器来初始化一个对象。
用法:
1.有类

class Task: Codable {
    var name: String
    init(_ name : String) {
        self.name = name
    }
}

var task = Task("Jarvis")

2.使用结构:

struct Task: Codable {
    var name: String
}

let task = Task(name: "jarvis")
eoxn13cs

eoxn13cs5#

我不会为该属性分配默认值,而是实现预期的init方法和一个不带任何参数的方便变量,或者使用一个创建“空”Task的工厂方法
下面是两个选项的代码

class Task: Codable {
    var name: String

    init(_ name: String) {
        self.name = name
    }

    convenience init() {
        self.init("")
    }

    static func emptyTask() -> Task {
        return Task("")
    }
}
twh00eeo

twh00eeo6#

你可以从json示例化一个对象(例如当你使用API时),如下所示:

struct Person: Codable {
var firstName: String
var lastName: String
var age: Int

enum CodingKeys: String, CodingKey {
    case firstName = "first_name"
    case lastName = "last_name"
    case age = "age"
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    
    firstName = try container.decode(String.self, forKey: .firstName)
    lastName = try container.decode(String.self, forKey: .lastName)
    age = try container.decode(Int.self, forKey: .age)
}

init(data: Data) {
    let decoder = JSONDecoder()
    do {
        let userDecoded = try decoder.decode(Person.self, from: data)
        
        self = userDecoded
    }
    catch {
        age = 0
        firstName = ""
        lastName = ""
    }
}

func fullName() -> String {
    return "\(self.firstName) \(self.lastName)"
}

}

相关问题