在Swift中为什么char *变成UnsafePointer <int8>?</int8>

时间:2014-08-04 23:13:24

标签: c swift

我已将包含另一个项目的Objective-C类的文件添加到我的Swift项目中。在其中一个Obj-C类中,有一个名为“decodingBuffer”的数据成员,类型为char *。我不是很精通C,但我认为char指针是C表示String的方式。当我尝试在我的Swift代码中获取此数据成员时,例如通过编写以下行

myObjCClass.decodedBuffer = "a new value"

我收到一条错误,提出decodeBuffer的类型为UnsafePointer<Int8>。所以我有两个问题:

  1. 为什么Swift中的char * a UnsafePointer<Int8>?如果有的话,我希望它是UnsafePointer<CChar>

  2. 如何在Swift中使用此值?我正在使用的库是一个黑盒子,并且完全在Objective-C中,所以我不是100%我将通过为decodeBuffer分配值来传递的数据将如何被处理。有关如何在Swift中与C对象进行交互的任何提示?是的我已经阅读了Swift文档中的“与C API交互”部分,但如果可能的话,我希望获得一些用户获得的与C API接口的智慧。

1 个答案:

答案 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.")