首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIFT5.2中未导入的大型C数组

SWIFT5.2中未导入的大型C数组
EN

Stack Overflow用户
提问于 2021-03-18 15:16:52
回答 1查看 133关注 0票数 2

我正在尝试导入一个C数组,它是64 to,用来作为设备上的日志的循环缓冲区。当我试图在Swift中访问这个数组时,会遇到以下错误

类型“logging”的值没有成员“数据”

为了回答有关桥接的潜在问题,我正在使用导入的C库中的其他类型,这些类型定义在这个模拟代码所产生的同一个文件中。

代码的设置如下:

logging.h

代码语言:javascript
复制
typedef struct _logging {
    uint8_t data[64*1024];
} logging;

ReadLog.swift

代码语言:javascript
复制
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导入此成员,没有问题。(我不知道截止点是什么)。

处理这件事最好的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-20 11:44:27

问题是C数组作为元组导入到Swift,而元组具有最大的一致性(例如,请参见Swift中元组基数的限制(如果有的话)是什么?)。Swift 5中的当前限制似乎是4096个元组元素。

一个可能的解决方法是创建一个C助手函数,它返回指向C数组的指针。使用SE-0044进口公司作为成员特性,可以使它看起来像Swift属性。

只需在定义logging结构的C头文件或桥接头文件中添加以下代码:

代码语言:javascript
复制
// 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代码中的日志数据:

代码语言:javascript
复制
struct ReadLog {
    var log = logging()

    func read() {
        //...Do some stuff...
        let char = log.dataPtr[0]
    }
}

但是请注意,没有数组边界检查,您必须确保log.dataPtr仅用于数组大小内的索引。

如果希望从Swift读取和写入日志记录结构,则将助手函数更改为

代码语言:javascript
复制
// Pointer to the data elements:
__attribute__((swift_name("getter:logging.dataPtr(self:)")))
static inline uint8_t * _Nonnull loggingDataPtr(logging * _Nonnull log)
{
    return log->data;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66693941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档