我想使用Accelerate框架来扩展[Float]和[Double],但这两种方法都需要不同的实现。
我试着明显:
extension Array<Float> {
}
并得到以下错误:
“必须使用由”where“子句指定得约束在非专用泛型类型”Array“上声明受约束得扩展”
在Swift 2中是否可以用这种方式扩展泛型类型?
现在,我已经让代码按预期运行了。下面是一个使用Accelerate框架进行总结的示例。
extension _ArrayType where Generator.Element == Float {
func quickSum() -> Float {
var result: Float = 0
if var x = self as? [Float] {
vDSP_sve(&x, 1, &result, vDSP_Length(x.count))
}
return result
}
}
extension _ArrayType where Generator.Element == Double {
func quickSum() -> Double {
var result: Double = 0
if var x = self as? [Double] {
vDSP_sveD(&x, 1, &result, vDSP_Length(x.count))
}
return result
}
}
8条答案
按热度按时间eiee3dmh1#
如果只想扩展特定类型数组,则应扩展_ArrayType协议
如果你扩展
Array
,你只能确保你的元素符合一些其他协议,例如:更新:使用Swift 3.1https://github.com/apple/swift/blob/master/CHANGELOG.md
omtl5h9j2#
雨燕3号前来救援!!
enyaitl33#
不如
或者如果你想要更多一点:
使用
Double
和Float
或任何其他符合ArithmeticType
和FloatLiteralConvertible
协议的类型。如果需要访问数组的特定索引,请将SequenceType
更改为CollectionType
,因为无法使用序列执行此操作。c3frrgcw4#
Xcode 8.2上的Swift 3
只需要扩展Sequence协议并提供一个where语句。
bn31dyow5#
如果您只想扩展特定的
Array
,则必须为每种类型使用一个协议:zu0ti5jz6#
FloatingPointType
是一个现有的协议,由Double、Float和CGFloat实现,因此是的。我昨天刚做了一个向SequenceType添加函数的操作,其中的元素必须是
Equatable
。这是一个修改,将元素限制为Float
你需要使用一个where子句。这是我下面的函数。
注意,我不能使它对数组起作用,但SequenceType更通用。
brccelvz7#
这对我很有效。我使用的是
Swift 5
。vshtjzan8#
下面是我使用
Swift 5
时的效果: