使用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
相关产品推荐
相关产品推荐

