Как передать аргументы пользовательской функции NSNumber для выражения NSE в Swift?

Ладно, ребята, я борюсь с этим: мне уже удалось заставить пользовательские функции без аргументов работать так:

NSExpression(format: "function(1+1, 'myCustomFunction'").expressionValueWithObject(nil, context: nil) as! Double

Но я понятия не имею, как реализовать пользовательскую функцию с аргументами, я уже пытался передать следующую строку в NSExpression без успеха:

"function(1+1, 'myCustomFunctionWithArgument(42)')" // 42 as the argument

где пользовательская функция выглядит так:

public extension NSNumber {
    func myCustomFunctionWithArgument(x: Double) -> NSNumber
         //...
}

Однако я получаю следующую ошибку:

-[__NSCFNumber myCustomFunctionWithArgument(42)]: unrecognized selector sent to instance 0xb000000000000045
2016-03-14 18:23:00.755 MyApp[3517:263390] *** Terminating app due to uncaught exception 

Я уже искал везде, и я только нахожу ответы Objective C, как в этом учебнике: https://spin.atomicobject.com/2015/03/24/evaluate-string-expressions-ios-objective-c-swift/

В конце он объясняет, как это сделать на Objective-C, но не на Swift. Есть ли способ сделать это? Кстати, это для моего приложения калькулятора.

1 ответ

Решение

Я получил код ниже, чтобы работать на детской площадке Xcode 7.2.1. Полученная ошибка была связана с селектором, и главное, что следует иметь в виду для селекторов, - это то, что в этом случае вам нужно использовать двоеточие (:) после имени функции, чтобы указать, что функция имеет один параметр.

import Foundation

public extension NSNumber {
    func myCustomFunctionWithArgument(x: NSNumber) -> NSNumber {
        return self.doubleValue + x.doubleValue
    }
}

let stringExpression = "function(1+1, 'myCustomFunctionWithArgument:', 42)"
let expression = NSExpression(format: stringExpression)
let result = expression.expressionValueWithObject(nil, context: nil) as! NSNumber
print(result.doubleValue)
Другие вопросы по тегам