我有一个通用存储类:
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,可以使用宏轻松完成。
最佳答案
从 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
和所有其他我'我们可能忘记了。
关于swift - Swift 中的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47200436/