我正在使用第三方c API,我试图用一个简单的字符串调用其中一个函数.像这样的东西:
some_c_func("aString");
我收到一个构建错误:
Type 'UnsafeMutablePointer<char_t>' does not conform to protocol 'StringLiteralConvertible'
我已经看到一些建议在字符串或类似的转换上使用utf8,它几乎在那里,但有以下错误:
some_c_func("aString".cStringUsingEncoding(NSUTF8StringEncoding)); 'UnsafePointer<Int8>' is not convertible to 'UnsafeMutablePointer<char_t>'
如何创建UnsafeMutablePointer?
这完全取决于char_t是什么.
如果char_t转换为Int8,则以下内容将起作用.
if let cString = str.cStringUsingEncoding(NSUTF8StringEncoding) { some_c_func(strdup(cString)) }
这可以折叠到
some_c_func(strdup(str.cStringUsingEncoding(NSUTF8StringEncoding)!))
警告!如果func cStringUsingEncoding(_ :)返回nil,则第二种方法将导致崩溃.
更新Swift 3,并修复内存泄漏
如果只在本地范围内需要C字符串,则不需要strdup().
guard let cString = str.cString(using: .utf8) else { return } some_c_func(cString)
cString将具有与str相同的内存生命周期(至少相似).
如果C字符串需要位于本地范围之外,那么您将需要一个副本.该副本需要被释放.
guard let interimString = str.cString(using: .utf8),let cString = strdup(interimString) else { return } some_c_func(cString) //… free(cString)