Я только начал с Swift на этой неделе, в частности Swift 4, и я использую библиотеку C через мостовой заголовок, liblo, который обрабатывает отправку / получение сообщений в формате OSC (Open Sound Control) через сетевой сокет.
Я могу запустить серверный поток, получать сообщения OSC через обратный вызов C-> Swift и читать числовые значения аргументов с помощью Swift. Однако у меня проблемы с чтением строковых значений.
Тип аргумента сообщения liblo lo_arg - это определение типа C для объединения, а строковые типы аргументов объявляются как простые символы, которые отображаются в Swift как Int8.
В C вы можете получить строку через &argv[i]->s
из массива lo_arg **argv
вашего обратного вызова. В проекте Obj-C с liblo я использую:
// get string value of first argument
lo_arg arg = argv[0];
NSString *s = [NSString stringWithUTF8String:&arg->s];
// do something with s
В Swift я попытался получить адрес Int8 и передать его String, который работает, но захватывает только первый символ:
// get string value of first argument
if var arg : lo_arg = argv?.pointee![0] {
withUnsafePointer(to: &arg.s) {
let s = String(cString: $0)
// so something with s
}
}
Я делаю что-то неправильно? Я бы подумал, что это будет эквивалентно, но передача $0
в strlen()
ala print("strlen: \(strlen($0)")
выводит только длину «1». Я подтвердил, что многосимвольная строка действительно отправляется с помощью тестовой программы, отличной от Swift. Теперь мне интересно, предполагает ли Swift каким-то образом, что строка является одним символом вместо адреса заголовка строки C, и / или мне нужно дополнительное преобразование указателя.