ios - 我可以拥有一个部分在 Swift 中实现,部分在 Objective C 中实现的类吗?

标签 ios objective-c swift class

我想扩展我用 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/

相关文章:

ios - 无法在SoundCloud API中获取某些用户的跟踪列表

swift - 为什么在将 8 位二进制值分配给 Int8 类型的 var 时,Swift 语言会发生溢出?

ios - Swift:Apple Mach-O 链接器 (id) 错误 - Xcode 8.3

ios - 使用 CTGetSignalStrength() 计算 IOS 信号强度

ios - 在 XCode UI 测试中等待所有 HTTP 请求完成?

ios - 如何在 iOS 中创建类似于 iTunes Connect 中的图表?

iphone - 如何同时检测主视图 UILongPressGestureRecognizer 和 subview UIPanGestureRecognizer

objective-c - 在 ios 中添加对象崩溃

ios - didEnterRegion()/didExitRegion() 在应用程序处于后台或设备锁定时从未触发

ios - 显示加载事件Webkit