【发布时间】:2022-01-17 18:34:06
【问题描述】:
我在库中有以下 C 风格结构:
typedef struct ServiceParam
{
const char *name;
const char *value;
} ServiceParam;
我有兴趣从 Swift 初始化这些结构的数组,这是我尝试过的:
let cHeaders = headers.map{ServiceParam(name: $0.name, value: $0.value)}
但收到以下警告:
将“字符串”传递给参数,但参数“值”应该是 比对 'init(name:value:)' 的调用寿命更长的指针
name 和value C 参数以UnsafePointer<CChar>! 的形式强制转换,输入类型为(name: String, value: String),即Swift 元组,但我在更改初始类型方面很灵活。
因此,整个最小示例如下所示:
public func setParams(headers: [(name: String, value: String)] = []) {
let cHeaders = headers.map{ServiceParam(name: $0.name, value: $0.value)}
// Do the work with `cHeaders`
}
从 Swift 调用站点初始化上述 C 样式结构的最佳方法是什么?
ServiceParam 结构仅在父函数调用期间临时使用,但 name 和 value 字符串作为 C++ 对存储在数组中,并且它们的生命周期在函数返回后继续:
稍后:
const auto paramPair = std::make_pair(params->name, params->value);
instance_variable_array.push_back(paramPair);
【问题讨论】:
-
ServiceParam结构的生命周期是多少?它们仅在该功能内使用还是更长?问题是 Swift 字符串的 C 字符串表示只是暂时的。您可能需要复制 C 字符串(并稍后释放该内存)。 -
更新了我的问题,回答了你的问题。
标签: arrays c swift string pointers