Отсутствует аргумент для параметра 'from' в вызове при создании экземпляра класса Codable - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь создать новый экземпляр кодируемого класса, но я не уверен, как:

var x = Articles();

выдает мне следующую ошибку:

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

class Articles: Codable {
    let value: [Article]? 
}

Я не понимаю, так как это класс без параметров.Я понятия не имею, что такое параметр from.

1 Ответ

0 голосов
/ 01 июля 2019

Я не понимаю, так как это класс без параметров. Я понятия не имею что такое параметр from.

Я не получаю ошибку, когда запускаю следующее:

class Articles: Codable {
    let value: [Articles]?

    init() {
        value = nil
        print("in init()")
    }
}

var x = Articles()

выход:

in init()

и без init():

class Articles: Codable {
    let value: [Articles]?

//    init() {
//        value = nil
//        print("in init()")
//    }
}

var x = Articles()  //Missing argument for parameter 'from' in call

Сначала прочитайте это :

Автоматическое наследование инициализатора

Как упоминалось выше, подклассы не наследуют свой суперкласс инициализаторы по умолчанию. Однако инициализаторы суперкласса автоматически наследуется, если соблюдены определенные условия. На практике, это означает, что вам не нужно писать переопределения инициализатора во многих общие сценарии, и может наследовать ваши инициализаторы суперкласса с минимальные усилия, когда это безопасно.

Предполагая, что вы предоставляете значения по умолчанию для любых новых свойств, которые вы ввести в подкласс, применяются следующие два правила:

Правило 1 Если ваш подкласс не определяет назначенные инициализаторы, он автоматически наследует все инициализаторы, назначенные для суперкласса.

Если вы посмотрите на документы , Codable - это typealias для протокола Decodable (протокол похож на интерфейс в Java). Протоколы определяют функции, которые класс должен реализовывать, если они принимают протокол. Ваш класс Articles принимает протокол Decodable. Тем не менее, документы для Decodable скажем,

init(from: Decoder)

Создает новый экземпляр путем декодирования из данного декодера. Необходимые. Предоставлена ​​реализация по умолчанию .

Протоколы могут на самом деле реализовывать функции с помощью расширений , которые затем наследуются классом, принимающим протокол.

В результате единственный обозначенный инициализатор для вашего класса - это тот, который определен в протоколе Decodable, который принимает один аргумент - который вы наследуете согласно Rule 1. С другой стороны, когда вы явно определяете другой назначенный инициализатор в вашем классе, который не принимает аргументов, вы будете вызывать этот инициализатор, когда вы не предоставите аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...