我已将包含另一个项目的Objective-C类的文件添加到我的Swift项目中。在其中一个Obj-C类中,有一个名为“decodingBuffer”的数据成员,类型为char *。我不是很精通C,但我认为char指针是C表示String的方式。当我尝试在我的Swift代码中获取此数据成员时,例如通过编写以下行
myObjCClass.decodedBuffer = "a new value"
我收到一条错误,提出decodeBuffer的类型为UnsafePointer<Int8>
。所以我有两个问题:
为什么Swift中的char * a UnsafePointer<Int8>
?如果有的话,我希望它是UnsafePointer<CChar>
。
如何在Swift中使用此值?我正在使用的库是一个黑盒子,并且完全在Objective-C中,所以我不是100%我将通过为decodeBuffer分配值来传递的数据将如何被处理。有关如何在Swift中与C对象进行交互的任何提示?是的我已经阅读了Swift文档中的“与C API交互”部分,但如果可能的话,我希望获得一些用户获得的与C API接口的智慧。
答案 0 :(得分:1)
就像Swift一样,在C中你可以声明mutable(var)或immutable(let)变量。
您的C库正在向您传递UnsafePointer<Int8>
=不可变值。
获得解决方案的一种方法是访问C代码,您可以将其更改为可变值。然后你可以处理:UnsafeMutablePointer =一个可变的值。
你的第二个问题是为什么它表示为&lt; Int8&gt;类型触及C中指针的核心。您不会将数据串传递到不同的内存位置。你传递指针。指针指向内存中保存的char数组的第一个字符(字符串)的内存位置。效率更高。
一个Swift示例,用于显示C指针的int值:
let greeting: String = "Hello World."
let greetingPointer = strdup(greeting) // UnsafeMutablePointer<Int8>?
print("I am your \(greetingPointer). I point to memory location of Greeting.")