如何在Swift 4中使用sizeof()方法

时间:2018-08-13 23:53:13

标签: swift sizeof audiobuffer

我正在尝试实现从苹果WWDC视频获得的代码。但是该视频来自2016年,我认为语法已更改。我怎么称呼sizeof(Float)?这会产生错误。

func render(buffer:AudioBuffer){
    let nFrames = Int(buffer.mDataByteSize) / sizeof(Float)
    var ptr = UnsafeMutableRawPointer(buffer.mData)
    var j = self.counter
    let cycleLength = self.sampleRate / self.frequency
    let halfCycleLength = cycleLength / 2
    let amp = self.amplitude, minusAmp = -amp
    for _ in 0..<nFrames{
        if j < halfCycleLength{
            ptr.pointee = amp
        } else {
            ptr.pointee = minusAmp
        }
        ptr = ptr.successor()
        j += 1.0
        if j > cycleLength {

        }
    }
    self.counter = j
}

2 个答案:

答案 0 :(得分:1)

Swift中不再支持sizeof()函数。

正如Leo Dabus在评论中所说,您想要MemoryLayout<Type>.size,或者您想要MemoryLayout<Float>.size

请注意,它告诉您该类型项目的抽象大小。但是,由于对齐,您不应假定包含不同类型项的结构将是其他元素的大小之和。另外,您需要考虑正在运行的设备。在64位设备上,Int为8字节。在32位设备上,它是4个字节。

有关更多信息,请参见MemoryLayout at SwiftDoc.org上的文章。

答案 1 :(得分:0)

请注意,MemoryLayout.size的含义不同于C / Obj-C中的sizeof。您可以阅读此旧线程https://devforums.apple.com/message/1086617#1086617

Swift使用泛型类型来明确表明该数字在编译时是已知的。

MemoryLayout.size是单个实例所需的空间,而MemoryLayout.stride是连续数组中连续元素之间的距离。 Swift中的MemoryLayout.stride与C / Obj-C中的sizeof(type)相同。

更精确

struct sample {
  let temp: Int
  let : Bool
}

MemoryLayout<Int>.size      // returns 8 on 64-bit
MemoryLayout<Bool>.size     // returns 1
MemoryLayout<sample>.size      // returns 9
MemoryLayout<sample>.stride    // returns 16 because of alignment requirements
MemoryLayout<sample>.alignment // returns 8, addresses must be multiples of 8