我想扩展我用 Swift 编写的类。我想在 Objective C 中编写扩展,因为我需要放入一些我无法移植到 Swift 中的 Objective C 代码。我知道我可以创建一个 .h
和 .m
,然后在桥接 header 中包含 .h
。但是在 .h
中,我需要包含原始的 .swift
类文件吗?
我该如何解决这个问题?我可以使用 myclass-swift.h
吗?谢谢。
最佳答案
以下文档可能会有所帮助: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 代码,需要桥接 header 。反过来,应该在 .m
(和 .mm
)中导入自动生成的 *-Swift.h
header >) 实现文件。文档说它不应导入到 .h
文件中。事实上,编译器不会让您将其导入直接或间接包含在桥接 header 中的 .h
文件。但是,您可以小心地将其导入其他 .h
文件。
现在,假设您的 Swift 类名为 SwiftClass
,并且您想向其添加一个名为 ocFunction()
的方法,该方法是在 Objective-C 中实现的。一种主要在上述答案中提出的方法是在 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):
@interface SwiftClassOC : NSObject
+(void)ocFunction:(SwiftClass*)sc;
@end
并通过桥接 header 使其对 Swift 可用。该实现将进入 .m
文件。那么你在 SwiftClass
中的 ocFunction()
看起来像
func ocFunction()
{
SwiftClassOC.ocFunction(self)
}
请注意 SwiftClassOC 是无状态的,因此它本质上是一组采用 SwiftClass
指针的辅助函数。 SwiftClass
是维护状态的。
关于ios - 我可以拥有一个部分在 Swift 中实现,部分在 Objective C 中实现的类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40374235/