Перечисление — это объектный тип данных, который предоставляет доступ к различным предопределенным значениям. Рассматривайте его как перечень возможных значений, то есть набор констант, значения которых являются альтернативами друг другу.
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}
}