Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中的代码重复_Swift_Accelerate Framework - Fatal编程技术网

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
对没有特定低级方法可调用的任何函数进行扩展。