检查通用类型是否属于 class 中的特定类型

checking if generic Type is of s specific Type inside class

假设我们有以下协议并且class:

protocol Numeric { }
extension Float: Numeric {}
extension Double: Numeric {}
extension Int: Numeric {}

class NumericProcessor<T:Numeric> {
    var test:T
    func processString(stringValue: String?)
        if T is Double {
            test = Double(stringValue)
        }
    }
}

我想要的是将字符串转换为特定的 T:Numeric。

test = T(stringValue)

虽然 Double(stringValue)、Float(stringValue) 会工作,但不会工作。

if T is Double {
   test = Double(stringValue)
}

不起作用,因为 T is Double 不能被询问。 我怎么可能在通用数字 class?

中解决这个问题

编辑

我是个白痴。您可以向协议添加初始化程序

protocol Numeric
{
    init?(_ s: String)
}

extension Float: Numeric{}

class NumericProcessor<T:Numeric>
{
    var test:T?

    func processString(stringValue: String?)
    {
        test = T(stringValue!)
    }
}

let n = NumericProcessor<Float>()

n.processString("1.5")
print("\(n.test)") // prints "Optional(1.5)"

原来不太好的回答

您可以在协议中添加一个静态函数来进行转换。

protocol Numeric
{
    static func fromString(s: String) -> Self?
}

extension Float: Numeric
{
    static func fromString(s: String) -> Float?
    {
        return Float(s)
    }
}

// Same pattern for Int and Double

class NumericProcessor<T:Numeric>
{
    var test:T?

    func processString(stringValue: String?)
    {
        test = T.fromString(stringValue!)
    }

}

let n = NumericProcessor<Float>()

n.processString("1.5")
print("\(n.test)") // prints "Optional(1.5)"

这个怎么样:

protocol Numeric { }
extension Float: Numeric {}
extension Double: Numeric {}
extension Int: Numeric {}

class NumericProcessor<T:Numeric> {
    var test:T?
    func processString(stringValue: String?)
        if T.self == Swift.Double {
            test = Double(stringValue) as? T
        } else if T.self == Swift.Float {
            test = Float(stringValue) as? T
        }
    }
}