在Swift中将String转换为UnsafeMutablePointer
发布时间:2020-12-14 02:23:35 所属栏目:百科 来源:网络整理
导读:我正在使用第三方c API,我试图用一个简单的字符串调用其中一个函数.像这样的东西: some_c_func("aString"); 我收到一个构建错误: Type 'UnsafeMutablePointerchar_t' does not conform to protocol 'StringLiteralConvertible' 我已经看到一些建议在字符串
我正在使用第三方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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |