如何在Swift中为NSExpression的自定义NSNumber函数传递参数?

时间:2016-03-14 21:40:02

标签: swift calculator nsnumber nsexpression

好吧,伙计们,我正在努力解决这个问题:我已经成功地制作了没有参数的自定义函数:

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

但我不知道如何使用参数实现自定义函数,我已经尝试将以下String传递给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/#comment-549856

最后,他解释了如何在Objective-C上完成它,而不是在Swift中。有什么办法吗?顺便说一句,这是我的计算器应用程序。

1 个答案:

答案 0 :(得分:1)

我得到了下面的代码,可以在Xcode 7.2.1游乐场中工作。你收到的错误与选择器有关,选择器要记住的主要事项是在这种情况下你需要在函数名后面加冒号(:)来表示该函数只有一个参数。 / p>

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)