Sta*_*huk 5 exception-handling nsexpression swift objective-c-swift-bridge
我想验证用户创建的表达式(如“2+2”、“5+7”或更复杂的)。我使用 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)")
}
Run Code Online (Sandbox Code Playgroud)
当我使用有效表达式(“2+2”)时 - 我得到了结果。但有时用户可能会提供错误的字符串(例如“2+”)。有了这个字符串,我的应用程序崩溃了:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "2+ == 1"'
Run Code Online (Sandbox Code Playgroud)
我不明白我如何捕捉这个异常以及为什么上面的代码不这样做。现在我使用 Objective C 类(具有相同的逻辑),从我的 swift 代码中调用这个方法,在那个类中我真的可以捕获这样的异常:
+(NSNumber *)solveExpression:(NSString *)string
{
id value;
@try {
NSExpression *ex = [NSExpression expressionWithFormat:string];
value = [ex expressionValueWithObject:nil context:nil];
}
@catch (NSException *e) { }
return value;
}
Run Code Online (Sandbox Code Playgroud)
这有效,我可以获得正确的解析状态(nil 表示表达式有问题)和结果(NSNumber),但我真的很想了解如何在 Swift 中正确且完全地完成所有这些事情。
NSInvalidArgumentException
不是 Java 异常意义上的可捕获错误。当您捕获此异常时,Apple 不保证您的程序将处于正确的状态,并且很可能会出现问题。
在将字符串传递给方法之前,您可能应该使用其他一些机制来检查字符串是否有效。