Как передать аргументы пользовательской функции 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)