我有一个Codable类:
class Task: Codable { var name: String }
当我尝试示例化它时:
let newTask = Task() allTasks.append(newTask)
它给了我错误:调用中缺少参数“from”的自变量我只想在数组中插入一个新对象(newTask),最简单的方法是什么?
njthzxwz1#
您可以从NSObject继承初始化式:
class Task: NSObject, Codable { var name: String = "" } let newTask = Task()
如果你不想继承NSObject,那么就创建你自己的初始化器:
class Task: Codable { var name: String? init() { } }
如果你不想把name设为可选的(或者设为默认值),就必须在init()中初始化它,比如:
name
class Task: Codable { var name: String init(withName name: String) { self.name = name } } let newTask = Task(withName: "ikevin8me")
a0zr77ik2#
还有一种解决方案是使用struct
struct
struct Task: Codable { var name: String } let task = Task(name: "myname")
qoefvg9y3#
您的Task类不提供自己的初始化器,因此它获取Codable协议中定义的初始化器(它从Decodable协议获取)。添加您自己的显式init(采用name参数)或将类更改为结构。无论采用哪种方法,都需要通过传入name值来创建Task,以便可以初始化name属性。所有这些都没有解决您发布的代码没有使用Codable的问题,因此您的类(或结构)可能不需要符合Codable。
Task
Codable
Decodable
init
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")
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("") } }
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)" }
}
6条答案
按热度按时间njthzxwz1#
您可以从NSObject继承初始化式:
如果你不想继承NSObject,那么就创建你自己的初始化器:
如果你不想把
name
设为可选的(或者设为默认值),就必须在init()中初始化它,比如:a0zr77ik2#
还有一种解决方案是使用
struct
qoefvg9y3#
您的
Task
类不提供自己的初始化器,因此它获取Codable
协议中定义的初始化器(它从Decodable
协议获取)。添加您自己的显式
init
(采用name
参数)或将类更改为结构。无论采用哪种方法,都需要通过传入name值来创建Task
,以便可以初始化name
属性。所有这些都没有解决您发布的代码没有使用
Codable
的问题,因此您的类(或结构)可能不需要符合Codable
。a8jjtwal4#
Task
类没有提供任何初始化器来初始化一个对象,这就是为什么它从Codable
协议中获取初始化器,提供你自己的初始化器来初始化一个对象。用法:
1.有类
2.使用结构:
eoxn13cs5#
我不会为该属性分配默认值,而是实现预期的init方法和一个不带任何参数的方便变量,或者使用一个创建“空”Task的工厂方法
下面是两个选项的代码
twh00eeo6#
你可以从json示例化一个对象(例如当你使用API时),如下所示:
}