何在混合应用程序(主要语言 ObjC)中从 Swift 获取对 appdelegate 的引用以避免引用循环

Posted

技术标签:

【中文标题】何在混合应用程序(主要语言 ObjC)中从 Swift 获取对 appdelegate 的引用以避免引用循环【英文标题】:Ho to get a reference to appdelegate from Swift in a mixed application (primary language ObjC) to avoid reference loop 【发布时间】:2014-11-13 14:22:23 【问题描述】:

首先我知道这个:How do I get a reference to the app delegate in Swift?

其次,我需要做的是在混合应用程序的 Swift 端访问 appdelegate 属性。

基本上, 1-我有一个项目是作为一个 Objective C 项目开始的。这意味着 AppDelegate 是在 Objective C 端定义的。 2- 我的 swift 代码工作正常,我有一个桥头,我可以从另一侧的任何一侧引用东西。 3- 问题出在这里:要在我的 Swift 代码中引用 appdelegate,我需要在桥接头中使用 #import "AppDelegate.h"。但由于其他原因,我还需要 AppDelegate.h 来导入 SWift 标头(PROJECT-Swift.h)。这会创建一个引用循环。

有没有办法避免这个引用循环?并且仍然访问 AppDelegate 属性?

编辑:我在第一版问题中没有提到的另一个复杂情况是,我想向 Swift 代码公开的 AppDelegate 属性实际上是在 Swift 端声明的类型。所以我需要在AppDelegate.h 中声明它并且能够做到这一点,我需要在我的AppDelegate.h 中导入-Swift.h 标头。 为了更清楚:KB 是在 Swift 端定义的public class。 AppDelegate 具有如下属性:@property (strong) KB *appkb; 我需要联系((AppDelegate*)UIApplication.SharedApplication()).appkb

【问题讨论】:

【参考方案1】:

您应该在AppDelegate.m 中导入PROJECT-Swift.h,而不是.h

AppDelegate.h 中,您可以使用“前向声明”(@class@protocol),例如:

AppDelegate.h:

#import <UIKit/UIKit.h>

@class SwiftClass;
@class KB;
@protocol SwiftProtocol;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) id<SwiftProtocol> swifter;
@property (strong, nonatomic) KB *appkb;

-(void)methodReceiveSwiftClass:(SwiftClass *)obj;

//...

@end

AppDelegate.m:

#import "AppDelegate.h"
#import "PROJECT-Swift.h"

@implemetation AppDelegate

//....

@end

PROJECT-Bridging-Header.h

#import "AppDelegate.h"

Any.swift:

@objc public protocol SwiftProtocol 
    // ...


@objc public class SwiftClass:NSObject 
    // ...


@objc public class KB:NSObject 
    // ...

The document 说:

为避免循环引用,请勿将 Swift 导入到 Objective-C 头文件中。相反,您可以转发声明一个 Swift 类以在 Objective-C 标头中使用它。请注意,您不能在 Objective-C 中继承 Swift 类。

【讨论】:

谢谢,这在某些情况下肯定会起作用。就我而言,我想向 Swift 代码公开的 AppDelegate 属性实际上是在 Swift 端声明的类型。所以我需要在AppDelegate.h 中声明它并且能够做到这一点,我需要在我的AppDelegate.h 中导入-Swift.h 标头对吧? 我看到了您编辑的问题,但我仍然认为AppDelegate.h 中的@class KB; 应该可以工作。你真的试过了吗?

以上是关于何在混合应用程序(主要语言 ObjC)中从 Swift 获取对 appdelegate 的引用以避免引用循环的主要内容,如果未能解决你的问题,请参考以下文章

Swift和Objective-C混合编程——Swift调用OC

arm体系如何对SWI功能

在 Python 中从 CSV 文件创建混合图表

在 Python 中从 CSV 文件创建混合图表

如何在自定义混合任务中从 Ecto 获取数据

C/C++和Lua混合编程