检查通用类型是否属于 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
}
}
}
假设我们有以下协议并且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
}
}
}