假设我们有以下协议和类:
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
无法被问到。
我怎么可能在一个通用的数字类中解决这个问题?
答案 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
}
}
}