Как использовать метод 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
Другие вопросы по тегам