Как преобразовать String в CString на языке Swift?

Я пытаюсь использовать dispatch_queue_create с динамической строкой, которую я создаю во время выполнения в качестве первого параметра. Компилятор жалуется, потому что ожидает стандартную строку c. Если я переключу это на строку времени, заданную для компиляции, ошибка исчезнет. Может ли кто-нибудь сказать мне, как преобразовать String в стандартную строку c?

Ответ 1

Вы можете получить CString следующим образом:

import Foundation

var str = "Hello, World"

var cstr = str.bridgeToObjectiveC().UTF8String

EDIT: Обновление Beta 5 - bridgeToObjectiveC() больше не существует (спасибо @Sam):

var cstr = (str as NSString).UTF8String

Ответ 2

Существует также String.withCString(), который может быть более уместным, в зависимости от вашего варианта использования. Пример:

var buf = in_addr()
let s   = "17.172.224.47"
s.withCString { cs in inet_pton(AF_INET, cs, &buf) }

Update Swift 2.2: Swift 2.2 автоматически соединяет строки String с C, поэтому приведенный выше пример теперь прост:

var buf = in_addr()
let s   = "17.172.224.47"
net_pton(AF_INET, s, &buf)

Гораздо проще: →

Ответ 3

Быстрые мосты 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)

Ответ 4

версия Swift 3 как @mbeaty say:

import Foundation

var str = "Hello World"

var cstr = str.cString(using: String.Encoding.utf8)

API Apple:

Foundation > String > cString (используя:)

Метод экземпляра

cString(using:)

Возвращает представление строки в виде строки C с использованием данной кодировки.