Перечисление — это объектный тип данных, который предоставляет доступ к различным предопределенным значениям. Рассматривайте его как перечень возможных значений, то есть набор констант, значения которых являются альтернативами друг другу.
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
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
4 Comments
Задание 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
Согласен с Vlados. И в ответе на Задание 1 — в for in в теле функции должно стоять result *= self.evalute(valueLeft), что бы перемножал определенное количество раз self.evalute(valueRight) на число, которое должно ВОЗВОВОДИТЬСЯ в степень self.evalute(valueLeft). А в ответе получается наоборот.
Задание 4: enum Day: String { case monday = «Понедельник» case tuesday = «Вторник» case wednesday = «Среда» case thursday = «Четверг» case friday = «Пятница» case saturday = «Суббота» case sunday = «Воскресение» var day: String {return self.rawValue} }
enum Day: String {
case monday = «Понедельник»
case tuesday = «Вторник»
case wednesday = «Среда»
case thursday = «Четверг»
case friday = «Пятница»
case saturday = «Суббота»
case sunday = «Воскресенье»
var label: String {return self.rawValue}
}