ユーザー作成の式(「2 + 2」、「5 + 7」以上の複合語など)を検証する必要があります。 NSExpressionクラスを使用して、この式を解析して計算します。これは私の遊び場コードです:NSExpressionを使用しているときにNSInvalidArgumentExceptionをキャッチする正しい方法
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)")
}
私が使用して有効な式( "2 + 2") - 私は結果を得ます。しかし、間違った文字列(例えば "2+")をユーザーが提供することがあります。この文字列で、これと私のアプリがクラッシュ:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "2+ == 1"'
は、私はこの例外をキャッチすることができ、なぜ上記のコードはこれをしない方法を理解していません。今私は私の迅速なコードからこのメソッドを呼び出すと、(同じロジックを持つ)Objective Cのクラスを使用し、そのクラスで私は本当にこのような例外をキャッチすることができます
+(NSNumber *)solveExpression:(NSString *)string
{
id value;
@try {
NSExpression *ex = [NSExpression expressionWithFormat:string];
value = [ex expressionValueWithObject:nil context:nil];
}
@catch (NSException *e) { }
return value;
}
これは動作し、私は正しいパース状態(ゼロ手段を得ることができます表現の問題)と結果(NSNumber)がありますが、私は本当にスウィフトでこのすべてのことを正確かつ完全に行う方法を理解したいと思います。
ありがとうございます。 "expression solving"だけでなく、 "expression validation"をサポートするライブラリを使うほうがよいようです。今私はhttps://github.com/davedelong/DDMathParserを見ています –