我正在尝试导入一个C数组,它是64 to,用来作为设备上的日志的循环缓冲区。当我试图在Swift中访问这个数组时,会遇到以下错误
类型“logging”的值没有成员“数据”
为了回答有关桥接的潜在问题,我正在使用导入的C库中的其他类型,这些类型定义在这个模拟代码所产生的同一个文件中。
代码的设置如下:
logging.h
typedef struct _logging {
uint8_t data[64*1024];
} logging;在ReadLog.swift中
struct ReadLog {
var log: logging = logging()
func read() {
//...Do some stuff...
let char = log.data.0 // <- Error here 'Value of type 'logging' has no member 'data'
}
}将数据大小更改为256导入此成员,没有问题。(我不知道截止点是什么)。
处理这件事最好的方法是什么?
发布于 2021-03-20 11:44:27
问题是C数组作为元组导入到Swift,而元组具有最大的一致性(例如,请参见Swift中元组基数的限制(如果有的话)是什么?)。Swift 5中的当前限制似乎是4096个元组元素。
一个可能的解决方法是创建一个C助手函数,它返回指向C数组的指针。使用SE-0044进口公司作为成员特性,可以使它看起来像Swift属性。
只需在定义logging结构的C头文件或桥接头文件中添加以下代码:
// Pointer to the data elements:
__attribute__((swift_name("getter:logging.dataPtr(self:)")))
static inline const uint8_t * _Nonnull loggingDataPtr(const logging * _Nonnull log)
{
return log->data;
}现在您可以通过指针读取Swift代码中的日志数据:
struct ReadLog {
var log = logging()
func read() {
//...Do some stuff...
let char = log.dataPtr[0]
}
}但是请注意,没有数组边界检查,您必须确保log.dataPtr仅用于数组大小内的索引。
如果希望从Swift读取和写入日志记录结构,则将助手函数更改为
// Pointer to the data elements:
__attribute__((swift_name("getter:logging.dataPtr(self:)")))
static inline uint8_t * _Nonnull loggingDataPtr(logging * _Nonnull log)
{
return log->data;
}https://stackoverflow.com/questions/66693941
复制相似问题