首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Swift中从CMutablePointer<CGFloat>到CGFloat[]

如何在Swift中从CMutablePointer<CGFloat>到CGFloat[]
EN

Stack Overflow用户
提问于 2014-06-05 03:58:39
回答 2查看 3.3K关注 0票数 11

我正在尝试将使用ObjC的Facebook的pop库类转换为Swift。Pop使用了相当多的C。

在ObjC,我有一个看起来像这样的街区.

代码语言:javascript
复制
prop.readBlock = ^(SHVGraphViewObjc *graphView, CGFloat values[]) {
                values[0] = [graphView.centerOffsets[idx] doubleValue];
            };

Swift中的等效闭包定义为

prop.readBlock = {(graphView: AnyObject!, values: CMutablePointer<CGFloat>) in }

我不明白的是如何将values[0] = [graphView.centerOffsets[idx] doubleValue];转换为Swift?我怎么让斯威夫特知道CMutablePointer<CGFloat>应该是CGFloat[]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-05 07:16:04

编辑:只是想在从网上文件(PDF)那里学到更多的东西之后,澄清一些事情。

Swift中有几种常用的指针类型,下面是它们如何映射到C等价物:

指针作为参数

代码语言:javascript
复制
CConstVoidPointer     => const void *
CMutableVoidPointer   => void *
CConstPointer<Type>   => const Type * 
CMutablePointer<Type> => Type *

作为返回类型、变量和参数的指针*

代码语言:javascript
复制
COpaquePointer      => void *
UnsafePointer<Type> => Type *

注意:参数在超过一个指针级别时只遵循规则,否则请参阅上文。

类类型的指针

代码语言:javascript
复制
CConstPointer<Type>              => Type * const *
CMutablePointer<Type>            => Type * __strong *
AutoreleasingUnsafePointer<Type> => Type **

斯威夫特指针

在Swift中使用CConstPointer<Type>指针时,可以传递以下任何一个:

  • nil,它将被计算为NULL指针。
  • CConstPointer<Type>
  • CConstVoidPointer
  • CMutablePointer<Type>
  • 一个CMutableVoidPointer
  • 一个AutoreleasingUnsafePointer<Type>值,必要时将转换为CConstPointer<Type>
  • 通过地址传递的Type值(&操作符)
  • Type[]阵列

NOTE:CConstVoidPointer也可以接受上述任何一个值。

在Swift中使用CMutablePointer<Type>指针时,可以传递以下任何一个:

  • nil,它将被计算为NULL指针。
  • CMutablePointer<Type>
  • 通过地址传递的Type值(&操作符)
  • 通过地址传递的Type[]数组(&操作符)

除了NOTE:CMutableVoidPointer值之外,CMUtableVoidPointer还可以接受上述任何一项。

因此,在您的示例中,CMutablePointer<CGFloat>也可能是指向CGFloat值数组的指针。虽然我不太清楚如何在斯威夫特中取消这一点。(也许是as操作符?)

票数 9
EN

Stack Overflow用户

发布于 2014-06-25 16:29:51

虽然筒仓的回答是非常详细的,但这里的具体问题是由罗斯在下面的评论回答的,所以我想我会把这些扩展成一个完整的答案。

我最近需要这样做,以便通过Swift与我的GPUImage框架进行接口。对于哈里斯角检测器,我在每个处理过的帧上使用一个回调块,它在X,Y坐标对中提供一个OpenGL浮点值的C数组,以及该数组的大小成对。我使用C数组来实现性能,因为这将在实时视频中每秒提供30-60次。在Objective中,我将使用如下代码来设置它:

代码语言:javascript
复制
UIImage *sourceImage = [UIImage imageNamed:@"ChairTest.png"];

GPUImageHarrisCornerDetector *cornerDetector = [[GPUImageHarrisCornerDetectionFilter alloc] init];

[cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
    NSLog(@"Number of corners detected: %d", cornersDetected);
    NSLog(@"Corner 1, X: %f, Y: %f", cornerArray[0], cornerArray[1]);
}];

GPUImagePicture *inputPicture = [[GPUImagePicture alloc] initWithImage:sourceImage];
[inputPicture addTarget:cornerDetector];
[inputPicture processImage];

在解析了正确的闭包语法之后,我无法完全理解如何访问输入C数组的值,将角坐标交给处理块。肖恩·希伯的推特指出了一种方法,我用它将上面的目标-C转换成以下Swift代码:

代码语言:javascript
复制
let sourceImage = UIImage(named: "ChairTest.png")

let cornerDetector = GPUImageHarrisCornerDetectionFilter()

cornerDetector.cornersDetectedBlock = { (cornerArray:CMutablePointer<GLfloat>, cornersDetected:Int, frameTime:CMTime) in
    println("Number of corners detected: \(cornersDetected)")
    let corners = UnsafePointer<GLfloat>(cornerArray)
    println("Corner 1, X: \(corners[0]) Y: \(corners[1])")
}

let inputPicture = GPUImagePicture(image: sourceImage)
inputPicture.addTarget(cornerDetector)
inputPicture.processImage()

这似乎在功能上是相同的。使用.withUnsafePointer()可能更安全,但我还没有完全理解它的语法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24051395

复制
相关文章

相似问题

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