2015-10-19 2 views
0

У меня есть UnsafeMutablePointer<Character>, заполненный методом CoreFoundation.Преобразование массива символов C (небезопасный указатель) в строку

Если я NSLog его с %s заполнителем, он выдает просто отлично.

Но если я попробую с Swift's print, он просто пишет адрес памяти.

Пробовал почти все ... также я не понимаю, почему, если я попытаюсь получить доступ к базовому имуществу memory, я получаю EXC_BAD_ACCESS.

let deviceName = UnsafeMutablePointer<Character>.alloc(64) 

/* other statements in which deviceName is filled */ 

NSLog("device %s by %s", deviceName, manufacturerName) 
// Outputs correctly the string 

print(String(deviceName[0])) 
// Get an EXC_BAD_ACCESS error at runtime 

print(String(deviceName.memory)) 
// Get an EXC_BAD_ACCESS error at runtime 

let str = withUnsafePointer(&deviceName) { String.fromCString(UnsafePointer($0)) } 
print(str) 
// Outputs an empty string 

print("\(deviceName) by \(manufacturerName)") 
// Outputs just memory addresses 
+0

Не могли бы вы показать немного больше своего кода, пожалуйста? Что находится в этом указателе, что вы делаете, какой результат вы после, и что происходит, когда вы пытаетесь? – matt

+0

@matt Конечно, добавлено – Teejay

+0

Итак, могу ли я предположить, что это на самом деле строка C? – matt

ответ

0

Вы, кажется, не хотите показывать свой код, поэтому я не могу помочь. Но это выглядит просто неправильно:

let deviceName = UnsafeMutablePointer<Character>.alloc(64) 
/* other statements in which deviceName is filled */ 

Это не как получить строки C в Swift, и если вы считаете, что это является С струной в Swift, вы ошибаетесь; он должен быть массивом Int8 (символы C), а не Swift Character (struct!), чтобы быть строкой C.

Другими словами, C char (название вопроса) не является Swift Character - они ничего как друг друга. C char - небольшое число, Swift Character - объект на объектно-ориентированном языке, о котором C ничего не знает!

+0

. Пожалуйста, прочитайте в комментарии выше. Если вы хотите, я могу скопировать весь код, это просто немного. Я сообщил о строке, заполняющей массив. – Teejay

+0

Я сказал вам, что вам нужно знать. Я не знаю, что делает AudioObjectGetPropertyData, но никак не в мире, если бы он предоставил массив C Swift Character. – matt

+0

Хорошо, теперь я попробовал с Int8, и печать 'deviceName [0]' приводит к 66, что является ascii-кодом для верхнего регистра B, для «Встроенного микрофона» – Teejay