【问题标题】:Code repetition in SwiftSwift 中的代码重复
【发布时间】:2018-04-22 08:43:51
【问题描述】:

我有一个通用的存储类:

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,则可以使用宏轻松完成。

【问题讨论】:

标签: swift accelerate-framework


【解决方案1】:

从 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 以及我可能忘记的所有其他人。

【讨论】:

  • 你实现的问题是vvsinf 只能用于UnsafeMutablePointer&lt;Float&gt;。对于Double,我们有vvsin 函数。整数类型没有正弦。
  • 我明白了。在这种情况下,您可能会强制转换为UnsafeMutablePointer&lt;Double&gt;,并且只需对FloatDouble 使用一个vvsin 实现。老实说,鉴于您只需要处理两种类型,我会坚持重复 sin。您仍然可以使用 Numeric 为任何没有特定低级方法可调用的函数进行扩展。
猜你喜欢
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多