尝试重新编写为Myo编写的 Objective-C 代码时,我遇到了 GLKQuaternion 类,它是一个联合并且在 Swift 中似乎不受支持(在 Swift 中使用来自 GLKit 的 GLKMath)。
我正在寻找的是一种解决方法来让它工作。也许是在 ObjectiveC 中完成了数学的混合应用程序,所以我可以访问这些属性。我有哪些选择?
尝试重新编写为Myo编写的 Objective-C 代码时,我遇到了 GLKQuaternion 类,它是一个联合并且在 Swift 中似乎不受支持(在 Swift 中使用来自 GLKit 的 GLKMath)。
我正在寻找的是一种解决方法来让它工作。也许是在 ObjectiveC 中完成了数学的混合应用程序,所以我可以访问这些属性。我有哪些选择?
最终使用了一个桥接文件并创建了一个小的包装层,以允许我从 Swift 访问我想要的数据。我称它为 polyfill,类似于我们在网络上用于增强旧浏览器功能的东西。
代码可在 github 上找到。特别是这个提交会很有趣,因为它显示了需要做什么。
Polyfill.h
@interface OrientationData: NSObject
@property (nonatomic) TLMAngle *pitch;
@property (nonatomic) TLMAngle *yaw;
@property (nonatomic) TLMAngle *roll;
@end
@implementation OrientationData
@end
@interface GLKitPolyfill: NSObject
+ (OrientationData *) getOrientation:(TLMOrientationEvent *)orientationEvent;
@end
Polyfill.m
+ (OrientationData *) getOrientation:(TLMOrientationEvent *)orientationEvent {
TLMEulerAngles *angles = [TLMEulerAngles anglesWithQuaternion:orientationEvent.quaternion];
OrientationData *result = [OrientationData new];
result.pitch = angles.pitch;
result.yaw = angles.yaw;
result.roll = angles.roll;
return result;
}
ViewController.swift
let angles = GLKitPolyfill.getOrientation(orientationEvent)
let pitch = CGFloat(angles.pitch.radians)
let yaw = CGFloat(angles.yaw.radians)
let roll = CGFloat(angles.roll.radians)
Apples Mix & Match 指南提供了有关如何使 Obj-C 与 Swift 一起工作的好技巧,反之亦然。