Swift类使用Swift类使用Objective-C类
我有一个obj-c项目,我成功地添加了一个新的
Swift类A,它被一些现有的obj-c类B使用 – 使用自动生成的“MyProject-Swift.h”标头按预期工作.
我还成功添加了一个新的Swift类C,它使用了一些现有的obj-c类D – 桥接头的使用也按预期工作. 但是,假设我想从我的Swift类C引用现有的obj-c类B(它又引用新的Swift类A).为此,我需要将“B.h”导入桥接头.但是,如果我这样做,我在B类中出现错误:“找不到’MyProject-Swift.h’文件”(即,不再生成文件). 我做错了什么或者这是Swift和Objective-C之间的一种互动是不允许的?看起来有一种循环引用,编译器无法解决. —编辑— 我会尝试通过添加一些代码来使问题更清晰. – 序言 – 我在一个obj-c项目中添加了一个新的Swift类: // SwiftClassA.swift import Foundation @objc class SwiftClassA : NSObject { var myProperty = 0 } 代码编译正确并在自动生成的“MyProject-Swift.h”标题中转换为obj-c存根,如下所示: // MyProject-Swift.h ... SWIFT_CLASS("_TtC7MyProject11SwiftClassA") @interface SwiftClassA : NSObject @property (nonatomic) NSInteger myProperty; - (instancetype)init OBJC_DESIGNATED_INITIALIZER; @end 现在,一个obj-c类使用SwiftClassA: // ObjCClass.h #import <Foundation/Foundation.h> #import <MyProject-Swift.h> @interface ObjCClass : NSObject @property (nonatomic,strong) SwiftClassA *aProperty; @property (nonatomic) int *aNumber; @end 这也可以无缝地工作. – 问题 – 我现在可以创建一个新的Swift类,它引用使用Swift类SwiftClassA的obj-c类(ObjCClass)吗? 这是我不能做的. 如果我添加新的Swift类: // SwiftClassB.swift import Foundation @objc class SwiftClassB : NSObject { var aPropertyOfClassB = 1 func someFunc() { var objCObject = ObjCClass() var theProperty = objCObject.aProperty print("The property is (theProperty)") } } 这当然不会编译,因为“使用未解析的标识符’ObjCClass’”.所以我需要将其添加到桥接头文件: // BridgingHeader.h #ifndef MyProject_BridgingHeader_h #define MyProject_BridgingHeader_h ... #import "ObjCClass.h" #endif 但是,ObjCClass.h文件将无法编译,而是“找不到”MyProject-Swift.h’文件”. 我在几个地方读过(虽然没有例子),这可能意味着有一个循环引用,并且使用@class的前向引用可以解决问题.但是,我不确定需要向前引用什么,以及我所有的尝试都失败了. 我希望这个问题现在不再混淆了!
这是典型的周期性参考问题.
小心阅读the docs:
所以,你应该在.h中使用“forward declare”,在.m中使用#import: // ObjCClass.h #import <Foundation/Foundation.h> @class SwiftClassA; @interface ObjCClass : NSObject @property (nonatomic,strong) SwiftClassA *aProperty; @property (nonatomic) int *aNumber; @end // ObjCClass.m #import "ObjCClass.h" #import "MyProject-Swift.h" @implementation ObjCClass // your code @end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |