Как умножить, добавить и т.д. ... SignedNumber с двойным в Swift? - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь построить немного универсальную интерполяционную функцию:

func interpolateNumber<T:SignedNumeric> (_ x0:T, with x1:T, bounds:ClosedRange<Double>, at:Double) -> Double{
    return x0 + (x1-x0) * (at-bounds.lowerBound)/(bounds.upperBound-bounds.lowerBound)
}

, но компилятор жалуется:

Binary operator '*' cannot be applied to operands of type 'T' and 'Double'

Bounds.lowerBound и .upperBound имеют значение Double, и они должны быть.Как применить оператор «*» к SignedNumeric и Double?

1 Ответ

0 голосов
/ 29 мая 2018

К сожалению, протокол SignedNumeric не поставляется с операторами / и *.Таким образом, вам придется привести тип T к более конкретному.Вот не очень красивый способ сделать это:

func interpolateNumber<T: SignedNumeric>(_ x0: T, with x1: T, bounds: ClosedRange<Double>, at: Double) -> Double {
    var x0Final: Double!
    var x1Final: Double!

    switch T.self {
    case is Double.Type:
        x0Final = x0 as! Double
        x1Final = x1 as! Double
    case is Float.Type:
        x0Final = Double(x0 as! Float)
        x1Final = Double(x1 as! Float)
    case is Float32.Type:
        x0Final = Double(x0 as! Float32)
        x1Final = Double(x1 as! Float32)
    case is Float64.Type:
        x0Final = Double(x0 as! Float64)
        x1Final = Double(x1 as! Float64)
    case is Float80.Type:
        x0Final = Double(x0 as! Float80)
        x1Final = Double(x1 as! Float80)
    case is Int.Type:
        x0Final = Double(x0 as! Int)
        x1Final = Double(x1 as! Int)
    case is Int8.Type:
        x0Final = Double(x0 as! Int8)
        x1Final = Double(x1 as! Int8)
    case is Int16.Type:
        x0Final = Double(x0 as! Int16)
        x1Final = Double(x1 as! Int16)
    case is Int64.Type:
        x0Final = Double(x0 as! Int64)
        x1Final = Double(x1 as! Int64)
    default:
        fatalError("Binary operator '*' cannot be applied to operands of type '\(T.self)' and 'Double'")
    }

    return x0Final + (x1Final - x0Final) * (at - bounds.lowerBound) / (bounds.upperBound - bounds.lowerBound)
}

print(interpolateNumber(3.0, with: 4, bounds: 0...10, at: 0.7)) // Prints 3.07
print(interpolateNumber(3, with: 4, bounds: 0...10, at: 0.7)) // Prints 3.07
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...