【问题标题】:Swift regards a C const pointer as mutable?Swift 认为 C const 指针是可变的?
【发布时间】:2020-02-22 12:05:00
【问题描述】:

我正在使用桥接头在 Swift 中导入 C 标头。我的 C API 看起来像这样:

typedef struct MyStruct {
  char buff[80];
} MyStruct;

const char* GetBuff(const MyStruct* m);

现在在 Swift 中,我尝试这样称呼它:

let b = MyStruct()
let mystr = String(cString: GetBuff(&b))

然后我得到这个编译错误:“不能将不可变值作为 inout 参数传递:'b' 是一个 'let' 常量”。为什么是这样? GetBuff() 的参数是一个 const 指针。 const 指针不是不可变的吗?

我知道将 'b' 更改为 'var b' 可以解决问题,但为什么需要这样做?

【问题讨论】:

标签: swift


【解决方案1】:

let b 是一个常量,因此您不能将其作为 inout 参数与&b 一起传递。但是您可以使用withUnsafePointer(to:) 获取指向其值的(临时)指针并将其传递给 C 函数。

let b = MyStruct()
let mystr = withUnsafePointer(to: b) { String(cString: GetBuff($0)) }

【讨论】:

  • 谢谢!但是为什么我不能通过它的地址呢? 'b' 是一个常数...
  • @bear_dk: &b 在 Swift 中是一个“in-out-expression”,表示可以在函数调用中对其进行修改。它不能与let 常量一起使用。 Swift 中的常量也不一定有地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多