【发布时间】:2018-06-10 18:50:22
【问题描述】:
我正在从 Apple SceneKit 扩展 SCNVector3,并使用数字进行算术运算。我对数字的类型使用泛型,但我发现我必须为每个函数编写至少两个版本,因为这不起作用:
extension SCNVector3 {
static func *<T> (left: SCNVector3, right: T) -> SCNVector3 {
return SCNVector3(left.x * Float(right), left.y * Float(right), left.z * Float(right))
}
并给出错误无法使用类型为“(T)”的参数列表调用类型“Float”的初始化程序
查看 Apple 文档中 Float 的 definition,我发现我能得到的最通用的是 init<Source: BinaryFloatingPoint> 或 init<Source: BinaryInteger>。
所以我必须重写扩展如下,为每个操作制作两个几乎相同的功能:
extension SCNVector3 {
static func *<T> (left: SCNVector3, right: T) -> SCNVector3 where T: BinaryFloatingPoint {
return SCNVector3(left.x * Float(right), left.y * Float(right), left.z * Float(right))
static func *<T> (left: SCNVector3, right: T) -> SCNVector3 where T: BinaryInteger {
return SCNVector3(left.x * Float(right), left.y * Float(right), left.z * Float(right))
}
我可以将 AND 放在 where 子句中 — 通过在 where 后面添加两个条件,用逗号分隔。
但是有什么方法可以放置 OR 那里吗?
【问题讨论】:
-
从技术上讲,您应该只有一个函数采用
Float,让函数的调用者正确转换。启用使用Double或UInt调用函数只是为了将值转换为Float是没有意义的,可能会截断精度。