2015-10-22 21 views
3

假设我们有以下的协议和类:检查是否泛型类型的具体类型的内部类

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

我要的是字符串到spesific牛逼转换:数字。

test = T(stringValue) 

将不起作用,虽然Double(stringValue),Float(stringValue)将工作。

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

不能工作,因为T is Double不会被问到。 我怎么可能在通用的Numeric类中处理这个问题?

回答

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