我可以在Swift中部分实现一个类,并在Objective C中部分实现吗?

时间:2016-11-02 07:10:34

标签: ios objective-c swift class

我想扩展我在Swift中编写的类。我想在Objective C中编写扩展,因为我需要放一些我无法移植到Swift中的Objective C代码。我知道我可以创建.h.m,然后在桥接标题中包含.h。但是在.h中,我需要包含原始的.swift类文件吗?

我该如何解决这个问题?我可以使用myclass-swift.h加入吗?感谢。

2 个答案:

答案 0 :(得分:2)

以下文档可能会对您有所帮助:https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID122。你可能已经看过了,但以防万一。以下问题也可能有所帮助:Extending a Swift class with Objective C category

如您所知,要在Swift中使用Objective-C代码,可以使用桥接头。反过来说,应该在*-Swift.h(和.m)实现文件中导入自动生成的.mm标头。文档说它不应该导入.h文件。实际上,编译器不允许您将其导入直接或间接包含在桥接头中的.h文件中。但是,您可以将其导入其他.h文件中。

现在,假设您的Swift类名为SwiftClass,并且您希望在Objective-C中添加一个名为ocFunction()的方法。一种方法,主要在前面提到的答案中提出,是在Objective-C源文件(.m)中实现一个类别:

@implementation SwiftClass (OCExtension)
-(void)ocFunction {...}
@end

然后修改您的SwiftClass以包含以下内容:

class SwiftClass : NSObject
{
...
    @nonobjc func ocFunction()
    {
        self.perform(Selector(("ocFunction")))
    }
...
}

引用的答案建议在扩展中执行此操作,但由于您可以完全控制SwiftClass源,因此您可以直接在类中执行此操作。顺便说一句,Objective-C类别函数可以被命名为SwiftClass函数之外的其他函数,因此不需要@nonobjc

另一种方法可能是定义一个Objective-C包装器接口,如下所示:

@interface SwiftClassOC : NSObject 
+(void)ocFunction:(SwiftClass*)sc;
@end

并通过桥接头将其提供给Swift。实现将进入.m文件。然后,ocFunction()中的SwiftClass看起来像

func ocFunction()
{
    SwiftClassOC.ocFunction(self)
}

请注意,SwiftClassOC是无状态的,因此它本质上是一组带有SwiftClass指针的辅助函数。 SwiftClass是维持国家的人。

答案 1 :(得分:0)

您可以使用Swift扩展Objective-C类,但不能使用Objective-C扩展Swift类。

  

我想在Objective C中编写扩展,因为我需要放一些我无法移植到Swift中的Objective C代码

你可以这样做,但不能作为Swift类的一部分。我通常做的是在Objective-C中创建一个“helper”类并将其导入Swift。