0

Swift に素敵な数学パーサーがあるかどうか疑問に思っています。つまり、文字列を取り、それを解くことができます。階乗、指数、平方根、およびすべての基本的な算術演算子が必要です。サードパーティ (DDMathParser や GCMathParser など) ではなく、Swift に組み込みたいです。

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 に答える