Swift类使用Swift类使用Objective-C类

Mai*_*aux 7 objective-c swift

我有一个obj-c项目,我成功地添加了一个新的Swift类A,它被一些现有的obj-c类B使用 - 使用自动生成的"MyProject-Swift.h"标头按预期工作.

我还成功添加了一个新的Swift类C,它使用了一些现有的obj-c类D - 桥接头的使用也按预期工作.

但是,假设我想从我的Swift类C引用现有的obj-c类B(后者又引用新的Swift类A).为此,我需要将"Bh"导入桥接头.但是,如果我这样做,我在B类中出现错误:"找不到'MyProject-Swift.h'文件"(即,不再生成文件).

我做错了什么或者这是Swift和Objective-C之间的一种互动是不允许的?看起来有一种编译器无法解决的循环引用.

---编辑---

我会尝试通过添加一些代码来使问题更清晰.

- 序言 -

我在一个obj-c项目中添加了一个新的Swift类:

//  SwiftClassA.swift
import Foundation
@objc class SwiftClassA : NSObject {
    var myProperty = 0
}
Run Code Online (Sandbox Code Playgroud)

代码编译正确,并在自动生成的"MyProject-Swift.h"标题中转换为obj-c存根,如下所示:

// MyProject-Swift.h
...
SWIFT_CLASS("_TtC7MyProject11SwiftClassA")
@interface SwiftClassA : NSObject
@property (nonatomic) NSInteger myProperty;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
Run Code Online (Sandbox Code Playgroud)

现在,一个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
Run Code Online (Sandbox Code Playgroud)

这也可以无缝地工作.

- 问题 -

我现在可以创建一个新的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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

这当然不会编译,因为"使用未解析的标识符'ObjCClass'".所以我需要将它添加到桥接头文件:

//  BridgingHeader.h
#ifndef MyProject_BridgingHeader_h
#define MyProject_BridgingHeader_h
...
#import "ObjCClass.h"
#endif
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,ObjCClass.h文件将无法编译,而是"找不到''MyProject-Swift.h'文件".

我在几个地方读过(虽然没有例子)这可能意味着有一个循环引用,并且使用@class的前向引用可以解决问题.但是,我不确定需要向前引用什么,以及我所有的尝试都失败了.

我希望这个问题现在不再混淆了!

rin*_*aro 12

这是典型的周期性参考问题.

小心阅读文档:

要避免循环引用,请不要将Swift导入Objective-C头文件.相反,您可以转发声明Swift类以在Objective-C头中使用它.请注意,您不能在Objective-C中子类化Swift类.

所以,你应该使用"forward declare"in .h#importin .m:

//  ObjCClass.h
#import <Foundation/Foundation.h>

@class SwiftClassA;

@interface ObjCClass : NSObject
@property (nonatomic, strong) SwiftClassA *aProperty;
@property (nonatomic) int *aNumber;
@end
Run Code Online (Sandbox Code Playgroud)
// ObjCClass.m
#import "ObjCClass.h"
#import "MyProject-Swift.h"

@implementation ObjCClass
// your code
@end
Run Code Online (Sandbox Code Playgroud)