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

Swift对比Objective-C

ARC 不允许将非 Objective-C 指针类型“const char *”隐式转换为“id”

iOS面试 --Objective-C相关

来自 Swift 的 CGRect 和 CGSize 扩展在 Objective-C 中不可见