【发布时间】:2019-05-22 23:08:14
【问题描述】:
我有一个 Objective-C 类,它用数百万个点填充 std:vector。向量的结构是:
typedef std::vector<CGPoint> CGContour;
typedef std::vector<CGContour> CGContours;
所以 CGContour 是 CGPoints 的向量,CGContours 是 CGContour 向量的向量。
我需要以某种方式在 Swift 类中访问这些数据。我不想使用 NSArray,因为与使用矢量相比,它有巨大的开销(它的大小和速度差不多是 10 倍)。
从我的 Objective-C 类中获取 Swift 中可访问数百万个 CGPoint 的最有效方法是什么?
编辑:
我正在像这样填充我的CGContours 向量:
contourVector = CGContours(contours.size());
populatedContourNum = 0
//contours is OpenCV's contours
for( long c = 0; c < contours.size(); c++) {
if (populatedContourNum >= contourVector.size()) {
contourVector.resize(contourVector.size() + 1);
}
contourVector[populatedContourNum] = CGContour(contours[c].size());
for( long pointNum = 0; pointNum < contours[c].size(); pointNum++ )
{
contourVector[populatedContourNum][pointNum] = CGPointMake(contours[c][pointNum].x * scale,
contours[c][pointNum].y * scale);
}
populatedContourNum++;
}
【问题讨论】:
-
你可以使用Objective-C++创建一个包装
std::vector的ObjC类,并暴露它的指针,这样它就可以在Swift中变成Unsafe(Mutable)BufferPointer<CGPoint>。它会工作,但它需要一些内存管理,如果向量的缓冲区无效,它将失败 -
谢谢!你能在答案中举一个例子吗?
-
不,我从未尝试过。我只是给你一个大致的调查方向
-
如果你想要一个具体的例子,请使用这些类型展示你的 Objective-C++ 代码。
-
谢谢!我添加了填充向量的方式。
标签: arrays objective-c swift nsarray stdvector