假设我们具有以下协议和类:
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
无法要求。我如何在通用数值类中解决这个问题?
编辑
我是个白痴。您可以向协议添加初始化程序
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)"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句