Несколько инициализаторов в одном классе (быстро)

Создайте класс Triangle со свойствами для хранения длины каждой стороны. Треугольники называются разносторонними, когда все три стороны имеют разную длину, равнобедренными, когда две стороны имеют одинаковую длину, или равносторонними, когда все три стороны имеют одинаковую длину.

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

Меня очень смущает этот вопрос. Мой вопрос: как я должен создать init равнобедренных и разносторонних в одном классе? Или я должен создать другой класс? Мне нужна помощь. Я новичок в Свифте. Вот что у меня есть до сих пор.

class Triangle {

    var sideA: Int
    var sideB: Int
    var sideC: Int

    init(sideA: Int, sideB: Int, sideC: Int) {

        self.sideA = sideA
        self.sideB = sideB
        self.sideC = sideC
    }

    convenience init(equilateralWithEdge edge:Int) {
        self.init(sideA: edge, sideB: edge, sideC:edge)
    }

}

person AllocSystems    schedule 12.12.2016    source источник
comment
Код, который вы разместили, в порядке. Каков ваш актуальный вопрос?   -  person rmaddy    schedule 12.12.2016
comment
ну, я создал инициализацию для равностороннего треугольника, я хотел знать, как поместить инициализацию для разносторонних и равнобедренных треугольников в один класс.   -  person AllocSystems    schedule 12.12.2016
comment
Вы добавляете другие инициализаторы точно так же, как вы добавляли один для равностороннего треугольника.   -  person rmaddy    schedule 12.12.2016


Ответы (1)


Вот как вы можете добавить еще один инициализатор в тот же класс, который будет использовать два параметра для создания равнобедренного треугольника:

class Triangle {

    var sideA: Int
    var sideB: Int
    var sideC: Int

    init(sideA: Int, sideB: Int, sideC: Int) {

        self.sideA = sideA
        self.sideB = sideB
        self.sideC = sideA
    }

    init(sideA: Int, sideB: Int) {

        self.sideA = sideA
        self.sideB = sideB
        self.sideC = sideB
    }

    convenience init(equilateralWithEdge edge:Int) {
        self.init(sideA: edge, sideB: edge, sideC:edge)
    }

}
person Andy Obusek    schedule 12.12.2016
comment
Почему бы не сделать 2-й init convenience, который вызывает 1-й? - person rmaddy; 12.12.2016
comment
Спасибо за помощь. Пожалуйста, не думай так. Вопрос из книги под названием «Сэмс научит себя быстро за 24 часа». Это не домашнее задание, я подумываю заняться программированием для ios, поэтому хочу расширить свои знания. Я всегда был специалистом по С++. - person AllocSystems; 12.12.2016
comment
Хорошо, я ошибаюсь в предположении, я уберу снарк из своего ответа. - person Andy Obusek; 12.12.2016
comment
@rmaddy: Он мог бы также сделать второй init удобным инициализатором, но я уверен, что он хотел показать вам пример использования второго назначенного инициализатора и еще один пример, показывающий использование удобного инициализатора. Просто помните, что бы вы ни выбрали, вы должны убедиться, что все свойства инициализированы и ни одно из них не осталось нулевым. И все удобные init должны указывать на назначенный init. Большую часть времени старайтесь иметь только одну назначенную инициализацию и используйте удобные инициализации для других инициализаций, но в конце концов все сводится к вашим предпочтениям. - person Adam; 01.10.2020