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

时间:2014-11-13 14:22:23

标签: objective-c swift appdelegate

首先我了解这一点:How do I get a reference to the app delegate in Swift?

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

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

有没有办法避免这个参考循环?并仍然访问AppDelegate属性?

编辑:我在第一版问题中没有提到的另一个复杂问题是,我想要暴露给Swift代码的AppDelegate属性实际上是在Swift方面声明的Type。所以我需要在AppDelegate.h中声明它并且能够这样做,我需要在-Swift.h中导入AppDelegate.h标题。
为了更清楚:
KB是在Swift方面定义的public class AppDelegate有一个属性:@property (strong) KB *appkb; 我需要抓住((AppDelegate*)UIApplication.SharedApplication()).appkb

1 个答案:

答案 0 :(得分:6)

您应该在PROJECT-Swift.h中导入AppDelegate.m,而不是.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-桥接-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类。