Как динамически находить и вызывать функции Swift на основе имен? - PullRequest
1 голос
/ 10 июля 2020

Я создаю приложение-калькулятор в 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.

...