swainwri
swainwri

Reputation: 64

Downcasting error in Swift 4 bridging class, which did not occur in Swift 3

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

Answers (0)

Related Questions