2016-03-14 3 views
1

gars bien, je suis aux prises avec ceci: je l'ai déjà réussi à créer des fonctions personnalisées sans arguments fonctionnent comme ceci:Comment passer des arguments à une fonction NSNumber personnalisée pour une expression NSE dans Swift?

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

Mais je n'ai aucune idée de la façon de mettre en œuvre une fonction personnalisée avec des arguments, je l'ai déjà essayé en passant la chaîne suivante à NSExpression sans succès:

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

où la fonction personnalisée ressemble à:

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

Cependant, je reçois l'erreur suivante:

-[__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 

je l'ai déjà cherché partout, et je trouve que des réponses Objective-C, comme sur ce tutoriel: https://spin.atomicobject.com/2015/03/24/evaluate-string-expressions-ios-objective-c-swift/#comment-549856

En fin de compte, il explique comment le faire sur Objective-C, mais pas dans Swift. Y a-t-il un moyen de le faire? Btw c'est pour mon application Calculatrice.

Répondre

1

J'ai obtenu le code ci-dessous pour travailler dans une aire de jeux Xcode 7.2.1. L'erreur que vous avez reçue a à voir avec le sélecteur, et la principale chose à garder à l'esprit pour les sélecteurs est que vous avez besoin d'un deux-points (:) après le nom de la fonction pour signifier que la fonction a un seul paramètre.

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)