Reputation: 64
Using a swift class to bridge between MathParser swift framework and an objective-c project, the @objc public func evaluateString(string: String, substitutions:Substitutions = [:]) throws -> NSNumber
compiled without problems using Swift 3, yet Swift 4 won't accept it.
Tried declaration as
@objc public func evaluateString(string: String, substitutions: Dictionary<String, Any> = [:]) throws -> NSNumber
, which compiles however runtime error indicates EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) when trying to downcast substitutions
.
MathParser can be found at https://github.com/davedelong/DDMathParser/tree/master/MathParser. Appreciate any direction here, as a bit of a numpty with swift.
import Foundation
import MathParser
@objc public enum AngleMode : Int {
case Radians
case Degrees
}
@objc public class DDMathParser : NSObject
{
@objc public var angleMeasurementMode = AngleMode.Radians
@objc public var Error : NSError?
// @objc public func evaluateString(string: String, substitutions: Dictionary<String, Any> = [:]) throws -> NSNumber
@objc public func evaluateString(string: String, substitutions:Substitutions = [:]) throws -> NSNumber
{
do {
let evaluator = Evaluator()
let expression = try Expression(string: string as String)
// let bridgedSubstitutions = substitutions as? Substitutions
let value = try evaluator.evaluate(expression, substitutions: substitutions!)
return NSNumber .init(value: value);
} catch let error as MathParserError {
.......
public protocol Substitution {
func substitutionValue(using evaluator: Evaluator, substitutions: Substitutions) throws -> Double
func substitutionValue(using evaluator: Evaluator) throws -> Double
func simplified(using evaluator: Evaluator, substitutions: Substitutions) -> Substitution
func simplified(using evaluator: Evaluator) -> Substitution
}
public extension Substitution {
func substitutionValue(using evaluator: Evaluator) throws -> Double {
return try substitutionValue(using: evaluator, substitutions: [:])
}
func simplified(using evaluator: Evaluator) -> Substitution {
return simplified(using: evaluator, substitutions: [:])
}
}
public typealias Substitutions = Dictionary<String, Substitution>
Upvotes: 0
Views: 181