Swift泛型类中如何为Double类型的TypedValue成员赋值?
问题描述
我有一个用于存储数值及其计量单位信息的TypedValue泛型类,该类需管理Double和Int类型的数值:
class TypedValue<T: Numeric> { var value: T var unitOfMeasure: String? init(value: T, unitOfMeasure: String? = nil) { self.value = value self.unitOfMeasure = unitOfMeasure } // 其他代码... }
另外我还有一个用于执行计算的Container泛型类(以下代码仅用于演示问题):
class Container<T: Numeric> { var v: TypedValue<T> init(v: TypedValue<T>) { self.v = v } func f1() { switch v.value { case is Int: v.value = 2 case is Double: v.value = 2.2 // <--- 此处报错! default: fatalError() } } }
遇到的错误:
Cannot assign value of type 'Double' to type 'T'
尝试另一种写法后:
func f2() { v.value = TypedValue(2.2) }
出现的错误:
Cannot assign value of type 'TypedValue' to type 'T'
请问当v存储的是Double类型数值时,如何为其赋予新的Double值?
解决方案
方法1:类型匹配后强制转换
通过switch判断类型后,将具体数值强制转换为泛型类型T,因为已经确认类型匹配,所以强制转换是安全的:
func f1() { switch v.value { case is Int: v.value = 2 as! T case is Double: v.value = 2.2 as! T default: fatalError() } }
方法2:利用Numeric协议的安全初始化
Numeric协议提供了init?<T>(exactly: T)方法,可以安全地将数值转换为目标类型T,避免强制解包:
func f1() { if v.value is Int, let newValue = T(exactly: 2) { v.value = newValue } else if v.value is Double, let newValue = T(exactly: 2.2) { v.value = newValue } else { fatalError() } }
方法3:修正f2的错误写法
f2的错误是将TypedValue实例赋值给了类型为T的v.value,正确写法分两种场景:
- 仅更新
v的数值:
func f2() { if let newValue = T(exactly: 2.2) { v.value = newValue } }
- 替换整个
v实例:
func f2() { v = TypedValue(value: 2.2 as! T) }
内容的提问来源于stack exchange,提问作者Fab
相关产品推荐
相关产品推荐

