我想扩展我在Swift中编写的类。我想在Objective C中编写扩展,因为我需要放一些我无法移植到Swift中的Objective C代码。我知道我可以创建.h
和.m
,然后在桥接标题中包含.h
。但是在.h
中,我需要包含原始的.swift
类文件吗?
我该如何解决这个问题?我可以使用myclass-swift.h
加入吗?感谢。
答案 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。