Ich möchte benutzerdefinierte Ausdrücke (wie "2 + 2", "5 + 7" oder komplexer) überprüfen. Ich verwende die NSExpression-Klasse, um diese Ausdrücke zu analysieren und zu berechnen. Das ist mein Spielplatzcode:Korrektes Abfangen von NSInvalidArgumentException bei Verwendung von NSExpression
import UIKit
let string = "2+2"
var ex:NSExpression?
do {
ex = NSExpression(format: string)
}
catch {
print("String is not valid expression")
}
if let result = ex?.expressionValue(with: nil, context: nil) as! NSNumber? {
print("result is \(result)")
}
Wenn ich gültigen Ausdruck ("2 + 2") verwende - bekomme ich das Ergebnis. Aber manchmal Benutzer kann falsche Zeichenfolge ("2+" zum Beispiel) zur Verfügung stellen. Mit dieser Zeichenfolge stürzt meine app mit diesem:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "2+ == 1"'
Ich verstehe nicht, wie ich diese Ausnahme abfangen kann und warum Code oben tut dies nicht. Jetzt benutze ich Objective C-Klasse (mit derselben Logik), diese Methode von meinem SWIFT-Code aufrufen, und in dieser Klasse wirklich kann ich eine solche Ausnahme fangen:
+(NSNumber *)solveExpression:(NSString *)string
{
id value;
@try {
NSExpression *ex = [NSExpression expressionWithFormat:string];
value = [ex expressionValueWithObject:nil context:nil];
}
@catch (NSException *e) { }
return value;
}
Dies funktioniert und ich kann richtig Parse-Zustand (nil Mittel erhalten Probleme mit Ausdruck) und Ergebnis (NSNumber), aber ich möchte wirklich verstehen, wie man all diese Dinge richtig und vollständig in Swift macht.
Vielen Dank. Sieht so aus, als wäre es besser, die Bibliothek mit der Unterstützung der "Validierung der Ausdrücke" zu benutzen, nicht nur mit dem Ausdruck "Lösen der Ausdrücke". Jetzt schaue ich auf https://github.com/davedelong/DDMathParser –