Мои соболезнования, так как код, который вы дали, немного беспорядок. Сначала он делает 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`)
}