检查泛型类型是否是类中的特定类型

时间:2015-10-22 13:11:01

标签: swift generics numeric

假设我们有以下协议和类:

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)
        }
    }
}

我想要的是将String转换为特定的T:Numeric。

test = T(stringValue)
虽然Double(stringValue),Float(stringValue)可以工作,但

不起作用。

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

不起作用,因为T is Double无法被问到。 我怎么可能在一个通用的数字类中解决这个问题?

2 个答案:

答案 0 :(得分:2)

修改

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

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)"

答案 1 :(得分:0)

这个怎么样:

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
        }
    }
}