Преобразование Objective-C memcpy в Swift

3

Мне поручено преобразовать некоторые функции из Objective-C в Swift. Мы используем файл C для передачи файлов на устройство Bluetooth. Вот код Objective-C, который необходимо преобразовать.

Из файла Objective-C:

NSString *room_name = filename;
NSData* bytes = [room_name dataUsingEncoding:NSUTF8StringEncoding];
UInt8 buff_name[bytes.length+1];
memcpy(buff_name, [room_name UTF8String],[room_name lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1);

Я застрял на memcpy для Swift и не уверен, что это самый безопасный метод для того, что мы пытаемся сделать. Спасибо.

  • 1
    Здесь, вероятно, больше кода, чем нужно для вопроса. Для ясности для будущих людей, которые найдут этот вопрос с помощью поиска, вы можете удалить части, не связанные с проблемой memcpy ?
  • 0
    @CharlesSrstka обновлен.
Теги:
swift-converter

1 ответ

3
Лучший ответ

Мои соболезнования, так как код, который вы дали, немного беспорядок. Сначала он создает NSData из room_name, преобразуя строку в UTF-8 в процессе, но затем он не использует эти NSData ни для чего иного, кроме определения размера буфера, а затем преобразует строку в UTF- 8 снова и копирует его в новый буфер. Это гораздо более неэффективно, как с точки зрения вычислений, так и с точки зрения читабельности, чем должно быть.

Если бы мы оставили это в Objective-C, мы бы уже хотели очистить код. Однако в Swift мы можем сделать это еще чище, потому что String имеет действительно хороший и простой метод, чтобы получить указатель на строковое представление UTF-8:

filename.withCString { ptr in
    // call whatever C-based functions expect a 'const char *' pointer here
}

Обратите внимание, что указатель, который вы получаете здесь, является неизменным. Если функции C, которые вы вызываете, ожидают, что смогут изменить буфер, вместо этого вы захотите сделать копию. Есть несколько способов сделать это, но самый простой, вероятно, просто:

guard var data = filename.data(using: .utf8) else {
    // handle this error somehow
}

data.withUnsafeMutableBytes { (ptr: UnsafeMutablePointer<Int8>) in
    // call whatever C-based functions expect a 'char *' pointer here
    // (if you need 'unsigned char *', use 'UInt8' instead of 'Int8')
}
  • 0
    Что еще хуже, все комментарии на китайском языке.
  • 1
    @temp_ Держись там. Съемка видео с котятами может помочь сохранить ваше здоровье.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню