«Дополнительный аргумент в вызове» - PullRequest
0 голосов
/ 24 апреля 2019

Я получаю сообщение об ошибке в своем super.init, как только я вызываю тип данных Enum из суперкласса.Что я здесь не так делаю?

class Atleta : Pessoa {

    var beltRanking : Int = 1
    let previousGraduation : Date
    var nextGraduation : Date

    init(beltRanking: Int, previousGraduation: Date, nextGraduation: Date) {

        self.beltRanking = 1
        self.previousGraduation = previousGraduation
        self.nextGraduation = nextGraduation

        super.init(name: name, country: country, birthDay: birthDay, email: email, joiningDate: joiningDate, role: RolePessoa) {

            self.name = name
            self.country = country
            self.birthDay = birthDay
            self.email = email
            self.joiningDate = joiningDate
            let role = RolePessoa()

        }

    }

Объявление перечисления в другом файле / классе:

enum RolePessoa {
    case Aluno
    case Funcionario
    case Instrutor
    case Visitante
}

Вот класс Pessoa:

class Pessoa {

    var bodyStats : BodyStats = BodyStats()
    let name : String
    let country : String
    let birthDay : Date
    let email : String
    let joiningDate : Date
    var role : RolePessoa

    //    var typeOfCar : CarType = .Coupe

    init(name: String, country: String, birthDay: Date, email: String, joiningDate: Date, role: RolePessoa) {

        self.name = name
        self.country = country
        self.birthDay = birthDay
        self.email = email
        self.joiningDate = joiningDate
        self.role = .Aluno

    }

}

1 Ответ

0 голосов
/ 24 апреля 2019

Описание проблемы

В коде есть скобки после вызова метода super.init(name: name, country: country, birthDay: birthDay, email: email, joiningDate: joiningDate, role: RolePessoa) в классе Atleta.Компилятор Swift считает, что это замыкание передается в качестве последнего параметра.

Решение

Намерение здесь состояло в том, чтобы вызвать метод super.init и передать туда правильные параметры.Мы можем изменить вызов метода для достижения цели:

super.init(name: name, country: country, birthDay: birthDay, email: email, joiningDate: joiningDate, role: .Aluno)

Обратите внимание, что мы передаем .Aluno как роль, так как она все равно используется в инициализаторе класса Pessoa.

Предложение по рефакторингу

Возможно, вы захотите удалить role из параметров инициализатора, чтобы упростить код или присвоить ему значение по умолчанию, например:

init(name: String, country: String, birthDay: Date, email: String, joiningDate: Date, role: RolePessoa = .Aluno) {

    self.name = name
    self.country = country
    self.birthDay = birthDay
    self.email = email
    self.joiningDate = joiningDate
    self.role = role
}

Тогда вызов super init можно изменить следующим образом:

super.init(name: name, country: country, birthDay: birthDay, email: email, joiningDate: joiningDate)

Обратите внимание, что в этом случае мы вообще не указываем role, так как он назначен .Alunoпо умолчанию.При необходимости мы также можем указать другую роль:

super.init(name: name, country: country, birthDay: birthDay, email: email, joiningDate: joiningDate, role: .Funcionario)

Существует хорошая официальная документация по инициализаторам для чтения для начинающих: Инициализация .

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