我想在swift中调用c ++函数
bool getId3Info(const char * filename , char *artist , char * title )
{
// get the file's id3v2 tag, write info back
strcpy(artist,(const char*) id3v2tag->artist().toCString(true));
strcpy(title,id3v2tag->title().toCString(true));
}
所以我为这个函数写了一个object-c包装器:
-(bool) getId3Info:(const char * )filename :( const char *)artist :( const char *) title
{
return getId3Info(filename, (char*)artist, (char*)title);
}
所以问题是我只能使用cStringUsingEncoding
来获得C字符串的表示
无法获得快速String
的真正缓冲
还有另外一种方法吗?
答案 0 :(得分:0)
在Swift中,您可以将const char*
传递给C函数,如下所示:
func foo(s: String) { s.withCString({ p in cfunction(p) }) }
或者,更明确地说明类型:
func foo(s: String) { s.withCString({ (p:UnsafePointer<CChar>) in cfunction(p) }) }
(即,p是UnsafePointer<CChar>
,相当于const char*
)
如果你想从C函数初始化一个字符串,你需要一个更复杂的咒语,如下所示:
var buf = Array<CChar>(count: 1000, repeatedValue: 0);
let result = buf.withUnsafeMutableBufferPointer({
(inout ptr: UnsafeMutableBufferPointer<CChar>) -> String? in
cfunction(ptr.baseAddress, ptr.count - 1)
String.fromCString(ptr.baseAddress)
})
请注意,C函数必须使缓冲区以空值终止。要么它永远不需要修改最后一个字节(因此ptr.count - 1
,就像你要调用strncpy
),或者它需要添加空终止符本身(如snprintf
),在这种情况下你可以传递完整的缓冲区大小。