我正在尝试实现从苹果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
}
答案 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