2016-03-14 2 views
1

Alright, ребята, я борюсь с этим: я уже успел сделать пользовательские функции без аргументов работать так:Как передать аргументы пользовательской функции NSNumber для NSExpression в 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/#comment-549856

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

ответ

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)