You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:52:36