问题 在Swift中使用GLKit中的GLKMath


所以我正在使用一本名为iOS Games的书,来自Ray Wenderlich的教程,并尝试利用那里发现的一些Objective-C代码来加速度计控制我游戏中的角色。而不是Objective-C,我想使用Swift。我在尝试创建一个GLKVector3类型的var时遇到了一个问题,它代表了一个3D矢量。当我输入时:

var raw:GLKVector3 = GLKVector3Make(irrelevant stuff)

我收到以下错误:

使用模块GLKVector3作为类型。

我在我的swift文件顶部有一个导入GLKit:

import GLKit

任何想法如何从我的程序中使用GLKMath文件获取功能?


4866
2017-07-08 01:43


起源



答案:


Swift在版本1.2中添加了联盟支持。导入联合中的字段是只读的,即使使用声明也是如此 var,但可以根据需要传递给C函数和从C函数传递。

Swift 1.2的发行说明暗示这些字段可能根本无法访问,但它们至少仍然可读 GLKit 类型:

Swift现在可以部分导入包含联合,位域,SIMD向量类型以及Swift本身不支持的其他C语言功能的C聚合。 Swift无法访问不受支持的字段,但可以在Swift中使用具有这些类型的参数和返回值的C和Objective-C API。这包括基金会 NSDecimal 类型和 GLKit GLKVector 和 GLKMatrix 类型等等。


8
2017-07-08 02:37



这是否意味着我根本不能使用GLKVector3? - DShaar
据我所知,不是今天的Swift。他们可能会在即将推出的版本中实施工会,但我还没有看到任何相关内容。 提交错误报告! - Nate Cook
有关可能的解决方法(创建C函数),请参阅: stackoverflow.com/questions/8262004/...  前提是接收者(框架,objc库)已经实现了一个联合。 - LearnCocos2D
@ LearnCocos2D你试过吗?问题是斯威夫特并没有弥补 GLKVector3 类型,因此编译器将不会识别或允许任何实例。 - Nate Cook
你可以将它包装在一个objc接口中,该接口将glk结构公开为swift可以使用的自定义结构。当然,如果你必须直接与使用glkit结构的api接口,这将停止有用,特别是在swift中不可能使用glk struct params覆盖方法的子类。 - LearnCocos2D


答案:


Swift在版本1.2中添加了联盟支持。导入联合中的字段是只读的,即使使用声明也是如此 var,但可以根据需要传递给C函数和从C函数传递。

Swift 1.2的发行说明暗示这些字段可能根本无法访问,但它们至少仍然可读 GLKit 类型:

Swift现在可以部分导入包含联合,位域,SIMD向量类型以及Swift本身不支持的其他C语言功能的C聚合。 Swift无法访问不受支持的字段,但可以在Swift中使用具有这些类型的参数和返回值的C和Objective-C API。这包括基金会 NSDecimal 类型和 GLKit GLKVector 和 GLKMatrix 类型等等。


8
2017-07-08 02:37



这是否意味着我根本不能使用GLKVector3? - DShaar
据我所知,不是今天的Swift。他们可能会在即将推出的版本中实施工会,但我还没有看到任何相关内容。 提交错误报告! - Nate Cook
有关可能的解决方法(创建C函数),请参阅: stackoverflow.com/questions/8262004/...  前提是接收者(框架,objc库)已经实现了一个联合。 - LearnCocos2D
@ LearnCocos2D你试过吗?问题是斯威夫特并没有弥补 GLKVector3 类型,因此编译器将不会识别或允许任何实例。 - Nate Cook
你可以将它包装在一个objc接口中,该接口将glk结构公开为swift可以使用的自定义结构。当然,如果你必须直接与使用glkit结构的api接口,这将停止有用,特别是在swift中不可能使用glk struct params覆盖方法的子类。 - LearnCocos2D


随着昨天(2015年2月8日)发布的Xcode 6.3 / Swift 1.2测试版,现在可以使用Swift的GLKit。


3
2018-02-10 03:02



知道如何将GLKMatrices作为制服传递吗?我正在尝试将其转换为UnsafePointer <Float>,但没有成功。会喜欢一些指针,就像它一样! - Gusutafu
@Gusutafu var viewProj = GLKMatrix4Multiply(...) var pData = uniformBuffer.contents() pData.advancedBy(sizeof(GLKMatrix4) * inflightBufferIndex) let address = withUnsafePointer(&viewProj) { UnsafeMutablePointer<Float>($0) } memcpy(pData, address, sizeof(GLKMatrix4)) - aoakenfo


在这里检查我的回购: https://github.com/noxytrux/SwiftGeom 我实际上构建了一个完整的lib,所以你不再被迫使用GLKit或等待Apple在swift中实现它。


2
2017-10-28 19:35