何在混合应用程序(主要语言 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 的引用以避免引用循环的主要内容,如果未能解决你的问题,请参考以下文章