Прежде всего: эта Data
структура является действительно плохой идеей, которая почти наверняка приведет к путанице. У Foundation
уже есть структура с именем Data
, и она полностью вездесуща, потому что это тип «единой валюты» для перемещения по нетипизированным байтам разных данных.
Более того, вы ничего не получите от используя [UInt8]
. Просто используйте Foundation.Data
.
Что касается вашего основного вопроса.
- Первый метод выделяет массив и использует
==
для его сравнения. Нет абсолютно никаких причин выделять 6 нулей. Если бы у buf
были элементы биллиона, вы бы выделили миллиард элементов? Расточительный. - Второй метод лучше, потому что вы не выделяете ненужный элемент, просто для сравнения. Однако это ручная функция, которая уже существует в стандартной библиотеке (
allSatisfy(_:)
, о которой я расскажу позже.) elementsEqual
- более обобщенная c версия ==
, который может сравнить одну последовательность с любой другой последовательностью. Вы решили сравнить его с массивом из 6 нулей, но это плохо (по той же причине, что и 0). Вместо этого вы можете использовать repeatElement(0, count: 6)
для создания элемента, который на самом деле не должен хранить n
копий. Он хранит только один и упаковывает его так, чтобы он соответствовал протоколу Collection.
Лучший из всех подходов - просто использовать allSatisfy
. Это быстро, не выделяет ничего лишнего, и , что наиболее важно , описывает, что именно вы пытаетесь express:
var containsJustZeros: Bool {
self.buf.allSatisfy { byte in byte == 0 }
}
Однако я бы не стал реализовывать это в компьютерной собственности. Те, у кого есть традиционное ожидание быстрой скорости, тогда как при этом выполняется линейное сканирование всего буфера. Если вы не хотите кэшировать результат в сохраненном логическом свойстве, я бы изменил его на func
.