首先我了解这一点: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
答案 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 {
// ...
}
要避免循环引用,请不要将Swift导入Objective-C头文件。相反,您可以转发声明Swift类以在Objective-C头中使用它。请注意,您不能在Objective-C中继承Swift类。