Swift中的代码重复
我有一个通用存储类:Swift中的代码重复,swift,accelerate-framework,Swift,Accelerate Framework,我有一个通用存储类: class Storage<T> { var storage: UnsafeMutablePointer<T> var size: Int32 init(_ size: Int) { self.size = Int32(size) self.storage = UnsafeMutablePointer<T>.allocate(capacity: size) } } 或者在双存储的情况下: import
class Storage<T> {
var storage: UnsafeMutablePointer<T>
var size: Int32
init(_ size: Int) {
self.size = Int32(size)
self.storage = UnsafeMutablePointer<T>.allocate(capacity: size)
}
}
或者在双存储的情况下:
import Accelerate
extension Storage where T == Float {
// In-place sine function.
func sin() {
vvsinf(storage, storage, &size)
}
}
import Accelerate
extension Storage where T == Double {
// In-place sine function.
func sin() {
vvsin(storage, storage, &size)
}
}
这两种实现之间的唯一区别是所用函数的名称(vvsinf
和vvsin
)。如果我们想通过添加更多这样的数学函数来扩展存储,我们将在两个地方复制粘贴每个函数的代码。如果我们还需要支持复制(而不是就地)数学操作,则需要重复代码的位置数将变为4
我的问题是:
是否有可能避免Swift中上述代码重复?
对于C,使用宏可以很容易地完成。从Swift 4开始,数字的继承结构更加清晰。请在此处查看更详细的信息: 就守则而言:
extension Storage where T: Numeric
{
func sin()
{
vvsinf(storage, storage, &size)
}
}
这将涵盖您的
Float
、Double
、Int
、UInt
,以及所有我可能忘记的其他内容。从Swift 4开始,数字的继承结构更为清晰。请在此处查看更详细的信息:
就守则而言:
extension Storage where T: Numeric
{
func sin()
{
vvsinf(storage, storage, &size)
}
}
这将涵盖
Float
、Double
、Int
、UInt
,以及我可能忘记的所有其他内容。我建议检查协议。我建议检查协议。您实现中的问题是vvsinf
只能用于不可靠指针
。对于Double
我们有vvsin
功能。整数类型没有正弦,我明白了。在这种情况下,您可能会强制转换为一个unsafemtablepointer
,只需为Float
或Double
使用一个vvsin
实现即可。老实说,考虑到您只需要处理两种类型,我只会坚持重复sin
。您仍然可以使用Numeric
对没有特定低级方法可调用的任何函数进行扩展。实现中的问题是vvsinf
只能用于unsafemeutablepointer
。对于Double
我们有vvsin
功能。整数类型没有正弦,我明白了。在这种情况下,您可能会强制转换为一个unsafemtablepointer
,只需为Float
或Double
使用一个vvsin
实现即可。老实说,考虑到您只需要处理两种类型,我只会坚持重复sin
。您仍然可以使用Numeric
对没有特定低级方法可调用的任何函数进行扩展。