我有一个通用的存储类:
class Storage<T> {
var storage: UnsafeMutablePointer<T>
var size: Int32
init(_ size: Int) {
self.size = Int32(size)
self.storage = UnsafeMutablePointer<T>.allocate(capacity: size)
}
}
我想将它扩展为能够具有不同的数学函数。例如,如果我想要Float
存储的正弦函数:
import Accelerate
extension Storage where T == Float {
// In-place sine function.
func sin() {
vvsinf(storage, storage, &size)
}
}
或Double
存储的情况:
import Accelerate
extension Storage where T == Double {
// In-place sine function.
func sin() {
vvsin(storage, storage, &size)
}
}
这两个实现之间的唯一区别是使用的函数名称(vvsinf
和vvsin
)。如果我们想通过添加更多这样的数学函数来扩展存储,我们将在两个地方为每个函数复制粘贴我们的代码。如果另外我们需要支持复制(而不是就地)数学运算,我们需要重复代码的位数变为4。
我的问题是:
是否可以避免Swift中上面描述的代码重复? 对于C,可以使用宏轻松完成。
答案 0 :(得分:0)
从Swift 4开始,数字的继承结构更加清晰。请在此处查看更详细的信息:https://github.com/apple/swift-evolution/blob/master/proposals/0104-improved-integers.md
就代码而言:
extension Storage where T: Numeric
{
func sin()
{
vvsinf(storage, storage, &size)
}
}
这将涵盖Float
,Double
,Int
,UInt
以及我可能忘记的所有其他人。