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

使用SQLite.swift 0.15.3选取Float类型字段时,遇“Subscript requires that Float conform to Value”编译错误的求助

SQLite.swift 0.15.3选取Float类型字段时,遇“Subscript requires that Float conform to Value”编译错误的求助

问题描述

我在Xcode 16中使用SQLite.swift 0.15.3,尝试读取一个Float类型的字段并赋值给变量时,遇到了编译错误。字段表达式是这样定义的:

let iAmount = Expression<Float>("Amount")

执行以下代码时:

for ri in try db.prepare(dtRecipeIngredients.order(iName).where(iUUIDRecipe == r[rUUID]))
{
    let amount: Float = ri[iAmount]

    let newIngredient = Ingredient(
        Name: ri[iName],
        Qnty: amount
    )
    // 后续逻辑
}

编译阶段直接抛出错误:

Subscript 'subscript(_:)' requires that 'Float' conform to 'Value'

目前String和Data类型的字段都能正常使用,想知道Float类型的字段表达式是不是有特殊的定义方式?


解决方案

这个问题的核心是SQLite.swift 0.15.3里原生Float类型并没有默认实现Value协议,而Expression<T>要求泛型参数T必须符合Value协议,才能通过结果集的下标获取对应值。这里有两种可行的解决办法:

方法一:用Double类型替代Float(推荐)

SQLite本身并没有原生的Float存储类型,所有浮点数值本质上都是以Double精度存储的,而SQLite.swift对Double有默认的Value协议支持。你可以修改字段表达式的类型,在需要的地方再转成Float:

// 重新定义字段为Double类型
let iAmount = Expression<Double>("Amount")

// 读取时转换为Float
let amount: Float = Float(ri[iAmount])

这种方式更贴合SQLite的存储逻辑,代码也更简洁,是优先推荐的方案。

方法二:手动让Float遵循Value协议

如果一定要坚持使用Float类型,可以给Float添加扩展,让它实现Value协议:

extension Float: Value {
    public static var declaredDatatype: String {
        return Double.declaredDatatype
    }
    
    public static func fromDatatypeValue(_ datatypeValue: DatatypeValue) -> Float {
        return Float(Double.fromDatatypeValue(datatypeValue))
    }
    
    public var datatypeValue: DatatypeValue {
        return Double(self).datatypeValue
    }
}

添加这个扩展后,你原来的Expression<Float>定义和赋值代码就能正常编译运行了。


备注:内容来源于stack exchange,提问作者Mike Matheson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:38:00