0

我想知道 Swift 中是否有任何不错的数学解析器。也就是说,它可以接受一个字符串并解决它。我需要它有阶乘、指数、平方根和所有基本的算术运算符。我希望它被内置到 Swift 中,而不是第 3 方(如 DDMathParser 和 GCMathParser)如果你能有几个就好了。

4

1 回答 1

5

没有像您所说的那样“内置于 Swift”的数学表达式解析器。

Foundation 框架中包含一个表达式评估器,它是 iOS 和 Mac OS X 的一部分,可从 Objective-C 和 Swift 访问。它被称为NSExpression

例子:

let expression = NSExpression(format: "2+3*4")
print(expression.expressionValueWithObject(nil, context: nil))
// prints "14"

它不包含阶乘函数,但本文描述了如何添加您自己的函数,并以阶乘为例。您必须自己将示例从 Objective-C 翻译成 Swift。

使用的主要问题NSExpression是,如果表达式字符串有任何错误,它就会崩溃。

:; xcrun swift
Welcome to Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2). Type :help for assistance.
  1> import Foundation
  2> let ex = NSExpression(format: "1+", argumentArray: [])
Process 78868 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = internal ObjC exception breakpoint(-5).
    frame #0: 0x0000000100000e90 repl_swift`repl_swift.repl_main() -> Swift.Int
repl_swift`repl_swift.repl_main() -> Swift.Int:
->  0x100000e90 <+0>: pushq  %rbp
    0x100000e91 <+1>: movq   %rsp, %rbp
    0x100000e94 <+4>: xorl   %eax, %eax
    0x100000e96 <+6>: popq   %rbp
Target 0: (repl_swift) stopped.
ex: NSExpression = <extracting data from value failed>

Execution stopped at breakpoint.  Enter LLDB commands to investigate (type help for assistance.)
(lldb) 

因此,如果您想获取用户提供的字符串并将其解析为数学表达式,您必须编写自己的解析器,或者使用第三方解析器,如DDMathParser.

于 2015-07-01T19:04:43.540 回答