#swift #macos
#swift #macos
Вопрос:
Я пытаюсь найти второе появление байтового шаблона в файле. Я могу успешно найти первое с помощью:
let mtrkChunk = Data(bytes: [0x4D, 0x54, 0x72, 0x6B] as [UInt8], count: 4)
и затем let mtrkChRng = data.range(of: mtrkChunk)
Но не могу понять, как сделать так, чтобы он соответствовал второму появлению. Любая помощь, как всегда, будет оценена
Комментарии:
1. Вы ищете второе или последнее событие? Существует несоответствие между заголовком вашего вопроса и телом вопроса.
2. Моя вина. Теперь изменил его, как должно быть вторым.
3. похоже, что функция range принимает параметр index. Таким образом, вы должны быть в состоянии взять mtrkChRng, продвинуть его на единицу и использовать это.
data.range(of: mrtrkChunk, in: mtrkChRng)
что-то вроде4. @estabroo Спасибо. Проверит это
Ответ №1:
Вы можете найти второе вхождение таким образом :
if let rg1 = data.range(of: mtrkChunk),
let rg2 = data[rg1.upperBound...].range(of: mtrkChunk) {
print(rg2)
}
Комментарии:
1. Спасибо. Я думал о чем-то подобном, но просто задавался вопросом, есть ли у swift что-то более удобное. Теперь я знаю 🙂
2. @ChrisBarrett Существует множество операций
String
, которые вы хотели бы изменить таким образом, чтобы они применялись только к части строки. Встраивание этого в каждую из этих операций привело бы к массовому раздуванию API (представьте себе добавлениеdrop(while, skipping:)
,shuffle(from:,to:)
аналогиdrop(while:)
shuffle()
, и т.д.). Вместо этого ответственность за нарезку строк была извлечена в строковые фрагменты (err,Substring
), на которых вы можете выполнять эти операции. Это делает весь API более компактным и предсказуемым (no1 никогда не забудет добавитьfrom
/to
args , потому что они никогда не понадобятся)
Ответ №2:
Посмотрите на параметры
let mtrkChRng = data.range(of: mtrkChunk, options: .backwards)