Перечисления (enumeration) в Swift

Домашняя работа к главе 22

Перечисление — это объектный тип данных, который предоставляет доступ к различным предопределенным значениям. Рассматривайте его как перечень возможных значений, то есть набор констант, значения которых являются альтернативами друг другу.

Задание 1

1) В конце главы про «Перечисления» мы с вами начали создавать перечисление ArithmeticExpression, позволяющее выполнять арифметические операции. Сейчас перед вами стоит задача доработать данное перечисление, чтобы оно могло производить любые арифметические операции, включая сложение, вычитание, умножение, деление и возведение в степень.
2) Проверьте работу перечисления на произвольных примерах

Правильный ответ

enum ArithmeticExpression {
    // указатель на конкретное значение
    case number( Int )
    // указатель на операцию сложения
    indirect case addition( ArithmeticExpression, ArithmeticExpression )
    // указатель на операцию вычитания
    indirect case subtraction( ArithmeticExpression, ArithmeticExpression )
    // указатель на операцию умножения
    indirect case multiplaction( ArithmeticExpression, ArithmeticExpression )
    // указатель на операцию деления
    indirect case division( ArithmeticExpression, ArithmeticExpression )
    // указатель на операцию возведения в степень
    indirect case pow( ArithmeticExpression, ArithmeticExpression )
    // метод, проводящий операцию
    func evaluate( _ expression: ArithmeticExpression? = nil ) -> Int{
        // определение типа операнда (значение или операция)
        switch expression ?? self{
        case let .number( value ):
            return value
        case let .addition( valueLeft, valueRight ):
            return self.evaluate( valueLeft )+self.evaluate( valueRight )
        case .subtraction( let valueLeft, let valueRight ):
            return self.evaluate( valueLeft )-self.evaluate( valueRight )
        case .multiplaction( let valueLeft, let valueRight ):
            return self.evaluate( valueLeft )*self.evaluate( valueRight )
        case .division( let valueLeft, let valueRight ):
            return self.evaluate( valueLeft )/self.evaluate( valueRight )
        case .pow( let valueLeft, let valueRight ):
            if self.evaluate( valueRight ) == 0 {
                return 1
            }else{
                var result = self.evaluate( valueLeft )
                for _ in 1..<self.evaluate( valueRight ){
                    result *= evaluate( valueLeft )
                }
                return result
            }
        }
    }
}
var hardExpr = ArithmeticExpression.pow( .number(3), .number(3) )
hardExpr.evaluate() // 27
hardExpr = ArithmeticExpression.multiplaction( .number(3), .number(3) )
hardExpr.evaluate() // 9

Задание 2

Корректно ли будет выполнен данный код? Если нет, то какие правки необходимо в него внести, чтобы исправить ошибки?
enum Seasons{
    case winter, spring, summer, autumn
}
let whiteSeason = Seasons.winter
var greenSeason: Seasons = .spring
greenSeason = .summer
var orangeSeason = .autumn
var bestSeason = whiteSeason
bestSeason = .summer
Правильный ответ

Ошибка в строке 7. У переменной orangeSeason не указан тип данных

Доступ закрыт

Дополнительные 2 задания доступны только подписчикам

Оформить доступ


4 Comments

  1. Vlados:

    Задание 1:

    enum ArithmeticExpression {
    // указатель на конкретное значение
    case number( Int )
    // указатель на операцию сложения
    indirect case addition( ArithmeticExpression, ArithmeticExpression )
    // указатель на операцию вычитания
    indirect case subtraction( ArithmeticExpression, ArithmeticExpression )
    // метод, проводящий операцию умножения
    indirect case multiplication( ArithmeticExpression, ArithmeticExpression )
    // метод, проводящий операцию деления
    indirect case division( ArithmeticExpression, ArithmeticExpression )
    // метод, проводящий операцию возведения в корень
    indirect case pow1( ArithmeticExpression, ArithmeticExpression )
    // метод, проводящий операцию
    func evaluate( _ expression: ArithmeticExpression? = nil ) -> Int{
    // определение типа операнда (значение или операция)
    switch expression ?? self{
    case let .number( value ):
    return value
    case let .addition( valueLeft, valueRight ):
    return self.evaluate( valueLeft ) + self.evaluate ( valueRight )
    case .subtraction( let valueLeft, let valueRight ):
    return self.evaluate( valueLeft ) — self.evaluate ( valueRight )
    case .multiplication( let valueLeft, let valueRight ):
    return self.evaluate( valueLeft ) * self.evaluate ( valueRight )
    case .division( let valueLeft, let valueRight ):
    return self.evaluate( valueLeft ) / self.evaluate ( valueRight )
    case .pow1( let valueLeft, let valueRight ):
    return Int (pow (Double (self.evaluate ( valueLeft )), Double (self.evaluate ( valueRight ))))
    }
    }
    }
    var hardExpr = ArithmeticExpression.addition( .number(20), .division( .number(10), .number(5) ) )
    hardExpr.evaluate() // 22

    var hardExpr1 = ArithmeticExpression.pow1( .number(10), .number(2) )
    hardExpr1.evaluate() // 100

    • apyeshhi:

      Согласен с Vlados. И в ответе на Задание 1 — в for in в теле функции должно стоять result *= self.evalute(valueLeft), что бы перемножал определенное количество раз self.evalute(valueRight) на число, которое должно ВОЗВОВОДИТЬСЯ в степень self.evalute(valueLeft). А в ответе получается наоборот.

  2. apyeshhi:

    Задание 4: enum Day: String {    case monday = «Понедельник»    case tuesday = «Вторник»    case wednesday = «Среда»    case thursday = «Четверг»    case friday = «Пятница»    case saturday = «Суббота»    case sunday = «Воскресение»    var day: String {return self.rawValue} }

  3. andros.tel:

    enum Day: String {
    case monday = «Понедельник»
    case tuesday = «Вторник»
    case wednesday = «Среда»
    case thursday = «Четверг»
    case friday = «Пятница»
    case saturday = «Суббота»
    case sunday = «Воскресенье»
    var label: String {return self.rawValue}
    }

Добавить комментарий