Swift

时间:2017-11-09 11:15:38

标签: 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)
  }
}

我想将它扩展为能够具有不同的数学函数。例如,如果我想要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)
  }
}

这两个实现之间的唯一区别是使用的函数名称(vvsinfvvsin)。如果我们想通过添加更多这样的数学函数来扩展存储,我们将在两个地方为每个函数复制粘贴我们的代码。如果另外我们需要支持复制(而不是就地)数学运算,我们需要重复代码的位数变为4。

我的问题是:

是否可以避免Swift中上面描述的代码重复? 对于C,可以使用宏轻松完成。

1 个答案:

答案 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)
    }
}

这将涵盖FloatDoubleIntUInt以及我可能忘记的所有其他人。