Какой самый простой способ создания нового объекта Codable в Swift? - PullRequest
0 голосов
/ 22 января 2019

У меня есть класс Codable:

class Task: Codable {
    var name: String
}

Когда я пытаюсь создать его экземпляр:

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

Это дает мне ошибку:

Отсутствует аргументдля параметра 'from' в вызове

Все, что я хочу, это вставить новый объект (newTask) в массив.Какой самый простой способ сделать это?

Ответы [ 5 ]

0 голосов
/ 22 января 2019

Я бы не назначил значение по умолчанию для свойства, но реализовал ожидаемый метод init и удобный вариант, который не принимал никаких аргументов или, в качестве альтернативы, имел метод фабрики, который создает «пустую» задачу

Вот код с обоими вариантами

class Task: Codable {
    var name: String

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

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

    static func emptyTask() -> Task {
        return Task("")
    }
}
0 голосов
/ 22 января 2019

Еще одним решением является использование struct

struct Task: Codable {
    var name: String
}

let task = Task(name: "myname")
0 голосов
/ 22 января 2019

Вы можете унаследовать инициализатор от 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")
0 голосов
/ 22 января 2019

Класс 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")
0 голосов
/ 22 января 2019

Ваш класс Task не имеет своего собственного инициализатора, поэтому он получает тот, который определен в протоколе Codable (который он получает из протокола Decodable).

Либо добавьте свой собственный явныйinit, который принимает параметр name или меняет ваш класс на структуру.В любом случае вам нужно создать Task, передав значение имени, чтобы можно было инициализировать свойство name.

Ничто из этого не учитывает тот факт, что в опубликованном вами коде не используется Codable поэтому, возможно, нет необходимости, чтобы ваш класс (или структура) соответствовал Codable.

...