Я создаю приложение-калькулятор в SwiftUI в рамках курса разработки iOS. Я создал иерархию классов для кнопок. Идея состоит в том, что каждая кнопка имеет метку (1
, 2
, +
, -
и т.д. c) и тип; тип определяет, какое действие выполняется при нажатии кнопки. Для цифровых кнопок нажатие на них добавляет метку к уже накопленному тексту; для бинарных операторов, таких как +
, нажатие на них берет два числа, накопленных на данный момент, и выполняет сложение.
class BinaryOperatorButton: CalculatorButton {
convenience init(_ label: String) {
self.init(label, type: .binaryOp)
}
override func action(n1: String, n2: String?) -> String {
guard let x = Float(n1) else {
fatalError("\(n1) is not a number")
}
guard let n = n2, let y = Float(n) else {
fatalError("\(String(describing: n2)) is not a number")
}
switch label {
case K.Operator.Plus.label:
return format(x + y)
case K.Operator.Minus.label:
return format(x - y)
case K.Operator.Times.label:
return format(x * y)
default:
return format(x / y)
}
}
}
Это работает, но для еще более чистого кода я хотел бы использовать метку +
, например, чтобы найти соответствующую функцию Swift динамически и полностью избавиться от блока переключения. Кажется, что это возможно с помощью селекторов, но я не смог найти никаких примеров, показывающих именно то, что я ищу. Я использую Xcode 11.5 со Swift 5.