Как использовать метод sizeof() в Swift 4
Я пытаюсь реализовать этот код, который я получил из яблочного видео 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 ответа
sizeof()
функция больше не поддерживается в Swift.
Как сказал в своем комментарии Лео Дабус, вы хотите MemoryLayout<Type>.size
или в вашем случае, MemoryLayout<Float>.size
,
Обратите внимание, что это говорит вам абстрактный размер элемента этого типа. Однако из-за выравнивания не следует предполагать, что структуры, содержащие различные типы элементов, будут суммами размеров других элементов. Кроме того, вы должны рассмотреть устройство, на котором оно работает. На 64-разрядном устройстве значение Int составляет 8 байтов. На 32-битном устройстве это 4 байта.
См. Статью о MemoryLayout на SwiftDoc.org для получения дополнительной информации.
Будьте осторожны, что MemoryLayout.size означает что-то отличное от sizeof в C/Obj-C. Вы можете прочитать эту старую ветку https://devforums.apple.com/message/1086617
Swift использует универсальный тип, чтобы явно указать, что число известно во время компиляции.
MemoryLayout.size - это пространство, необходимое для отдельного экземпляра, тогда как MemoryLayout.stride - это расстояние между последовательными элементами в непрерывном массиве. MemoryLayout.stride в Swift такой же, как sizeof(тип) в C/Obj-C.
Чтобы быть более точным
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