Как конвертировать строку в строку CSt на языке Swift?
Я пытаюсь использовать dispatch_queue_create с динамической строкой, которую я создаю во время выполнения, в качестве первого параметра. Компилятор жалуется, потому что ожидает стандартную строку c. Если я переключу это на строку, определенную во время компиляции, ошибка исчезнет. Может кто-нибудь сказать мне, как преобразовать строку в стандартную строку с?
6 ответов
Вы можете получить CString
следующее:
import Foundation
var str = "Hello, World"
var cstr = str.bridgeToObjectiveC().UTF8String
РЕДАКТИРОВАТЬ: бета-версия 5 обновление - bridgeToObjectiveC()
больше не существует (спасибо @Sam):
var cstr = (str as NSString).UTF8String
Существует также String.withCString(), который может быть более подходящим, в зависимости от вашего варианта использования. Образец:
var buf = in_addr()
let s = "17.172.224.47"
s.withCString { cs in inet_pton(AF_INET, cs, &buf) }
Обновление Swift 2.2: Swift 2.2 автоматически связывает строки со строками C, поэтому приведенный выше пример теперь прост:
var buf = in_addr()
let s = "17.172.224.47"
net_pton(AF_INET, s, &buf)
Гораздо проще;->
Быстрые мосты String и NSString. Я считаю, что это может быть возможной альтернативой ответу Цезария:
import Foundation
var str = "Hello World"
var cstr = str.cStringUsingEncoding(NSUTF8StringEncoding)
Документация по API:
/* Methods to convert NSString to a NULL-terminated cString using the specified
encoding. Note, these are the "new" cString methods, and are not deprecated
like the older cString methods which do not take encoding arguments.
*/
func cStringUsingEncoding(encoding: UInt) -> CString // "Autoreleased"; NULL return if encoding conversion not possible; for performance reasons, lifetime of this should not be considered longer than the lifetime of the receiving string (if the receiver string is freed, this might go invalid then, before the end of the autorelease scope)
Версия Swift 3 как говорят @mbeaty:
import Foundation
var str = "Hello World"
var cstr = str.cString(using: String.Encoding.utf8)
Apple API:
Foundation> String> cString (используя:)
Метод экземпляра
cString(using:)
Возвращает представление String в виде строки C с использованием заданной кодировки.
Swift 5
Не забудьте гарантировать срок службы, например:
let myVariable: String = "some text...";
withExtendedLifetime(myVariable) {
myVariable.utf8CString.withUnsafeBufferPointer { buffer in
let result = buffer.baseAddress!;
// ... Do something with result
}
}