【问题标题】:NSExpression Calculator in SwiftSwift 中的 NSExpression 计算器
【发布时间】:2014-07-11 18:18:48
【问题描述】:

我试图在 Swift 中复制 Need to write calculator in Objective-C,但我的代码不起作用。

import Foundation

var equation:NSString = "5*(2.56-1.79)-4.1"

var result = NSExpression(format: equation, argumentArray: nil)

println(result)

【问题讨论】:

  • resultNSExpression,而不是结果。您需要致电result.expressionValue(object:nil context:nil),并致电floatValue(除非可以接受NSNumber)。

标签: ios cocoa-touch swift ios8


【解决方案1】:

正如评论中所说,您必须致电expressionValueWithObject() 关于表达式:

let expr = NSExpression(format: equation)
if let result = expr.expressionValueWithObject(nil, context: nil) as? NSNumber {
    let x = result.doubleValue
    println(x)
} else {
    println("failed")
}

Swift 3 更新:

let expr = NSExpression(format: equation)
if let result = expr.expressionValue(with: nil, context: nil) as? Double {
    print(result) // -0.25
} else {
    print("failed")
}

【讨论】:

  • 好东西!我有点困惑为什么我的表达式var equation = "11 / 2" 会评估为5.0。我认为它需要在字符串本身中将值指定为双精度值——var equation = "11.0 / 2.0" // 5.5
【解决方案2】:

详情

  • Xcode 9.4.1、Swift 4.1
  • Xcode 10.2.1 (10E1001)、Swift 5

解决方案

import Foundation

extension String {

    private func allNumsToDouble() -> String {

        let symbolsCharSet = ".,"
        let fullCharSet = "0123456789" + symbolsCharSet
        var i = 0
        var result = ""
        var chars = Array(self)
        while i < chars.count {
            if fullCharSet.contains(chars[i]) {
                var numString = String(chars[i])
                i += 1
                loop: while i < chars.count {
                    if fullCharSet.contains(chars[i]) {
                        numString += String(chars[i])
                        i += 1
                    } else {
                        break loop
                    }
                }
                if let num = Double(numString) {
                    result += "\(num)"
                } else {
                    result += numString
                }
            } else {
                result += String(chars[i])
                i += 1
            }
        }
        return result
    }

    func calculate() -> Double? {
        let transformedString = allNumsToDouble()
        let expr = NSExpression(format: transformedString)
        return expr.expressionValue(with: nil, context: nil) as? Double
    }
}

用法

"3*(3-1)-5".calculate()

完整样本

    func test(_ expressrion: String) {
    if let num = expressrion.calculate() {
        print("\(expressrion) = \(num)")
    } else {
        print("\(expressrion) = nil")
    }
}

test("3*(3-1)-5")
test("5.2*(2-1.79)-5.1")
test("11/5")

结果

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 2016-02-26
  • 1970-01-01
相关资源
最近更新 更多