Objective-C中结构的扩展
Posted
技术标签:
【中文标题】Objective-C中结构的扩展【英文标题】:Extension of a struct in Objective-C 【发布时间】:2017-09-07 17:44:44 【问题描述】:我在 Swift 中有一个扩展名(SCNVector3
),如下所示:
extension SCNVector3
// some functions extending SCNVector3 here....
我想将此扩展转换为 Objective-C。我知道 ObjC 中扩展的等价物是“类别”,但似乎不可能在 SCNVector3
这样的结构上创建类别。
https://developer.apple.com/documentation/scenekit/scnvector3
【问题讨论】:
Objective C 中没有等效的 Swift 结构。您应该将扩展的方法实现为 C 函数。 感谢您的回答。您能否详细说明如何进行?非常感谢! 我写了一个例子作为答案。 【参考方案1】:Objective C 中没有等效的 Swift 结构。您应该将扩展的方法实现为 C 函数。例如计算向量的长度:
inline SCNVector3 ExtSCNVector3Subtract(SCNVector3 inA, SCNVector3 inB)
return SCNVector3Make(inA.x - inB.x, inA.y - inB.y, inA.z - inB.z);
inline float ExtSCNVector3Length(SCNVector3 inA)
return sqrtf(inA.x * inA.x + inA.y * inA.y + inA.z * inA.z);
如何命名函数完全取决于您的喜好。你这样称呼它:
SCNVector3 a = ...;
SCNVector3 a = ...;
float distance = ExtSCNVector3Length(ExtSCNVector3Subtract(a, b));
【讨论】:
这看起来很棒!那么,我应该创建一个 .c 文件和相应的 .h 文件吗?有一个具体的名字?然后,我该怎么做才能让编译器理解这些扩展函数扩展了 SCNVector3 ?谢谢!!! 如果你将函数声明为inline
你不需要.c文件。对于编译器来说,没有必要这样做。它只是一个普通的 C 函数,你也必须像其他函数一样调用它。
我有以下扩展函数:func distance(from vector: SCNVector3) -> Float let distanceX = self.x - vector.x let distanceY = self.y - vector.y let distanceZ = self.z - vector.z return sqrtf((distanceX * distanceX) + (distanceY * distanceY) + (distanceZ * distanceZ)) 如果我将其转换为 Obj C 并将其放在任何地方,我看不出它是如何工作的在我的代码中。感谢您的帮助。
我要试试这个。会告诉你的。谢谢。以上是关于Objective-C中结构的扩展的主要内容,如果未能解决你的问题,请参考以下文章
在 Objective-C 代码中使用 Swift 的缺点?
获取根 ViewController - Objective-C