Как конвертировать строку в строку 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

var cstr = (userStr as NSString).utf8String

Swift 5

Не забудьте гарантировать срок службы, например:

      let myVariable: String = "some text...";
withExtendedLifetime(myVariable) {
    myVariable.utf8CString.withUnsafeBufferPointer { buffer in
        let result = buffer.baseAddress!;

        // ... Do something with result
    }
}
Другие вопросы по тегам