使用Objective-C的Swift类使用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
}

代码正确编译,并在自动生成的“ 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的正向引用可以解决此问题。但是,我不确定需要转发哪些内容以及在何处转发,所有尝试都失败了。

我希望这个问题现在不再令人困惑!

林太郎

这是一个典型的循环引用问题。

请仔细阅读文档

为了避免循环引用,请不要将Swift导入到Objective-C头文件中相反,您可以向前声明一个Swift类,以在Objective-C标头中使用它。请注意,您不能在Objective-C中继承Swift类。

因此,您应该在.h#import使用“转发声明” .m

//  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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Swift代码的Objective C测试类

来自分类Dev

Swift使用Objective-C类

来自分类Dev

在Objective-C中使用Swift类

来自分类Dev

在objective c 类中使用delegate 调用swift 方法

来自分类Dev

如何使用std:vector使Objective-c类可供Swift类使用

来自分类Dev

如何使用std:vector使Objective-c类可供Swift类使用

来自分类Dev

在Swift项目的故事板上使用Objective-C类作为自定义类

来自分类Dev

对不继承自Objective-C类的Swift类使用@objc属性

来自分类Dev

在 Swift 中对类参数使用类 func

来自分类Dev

无法在Objective-C单元测试中使用Swift类

来自分类Dev

如何在Swift中使用可达性Objective-C类

来自分类Dev

在Objective c中使用Swift类。发生未声明的标识符错误

来自分类Dev

在Objective c中使用Swift类。发生未声明的标识符错误

来自分类Dev

如何使用Swift中的协议公开Objective-C对象的私有类方法?

来自分类Dev

如何在Swift中使用名称为Objective-C的类作为关键字

来自分类Dev

使用Swift扩展的UIView类

来自分类Dev

使用Swift iOS导入类

来自分类Dev

使用 Swift 类继承变量

来自分类Dev

符合Objective-C协议的Swift类

来自分类Dev

Objective-C类中的Swift协议

来自分类Dev

Swift类扩展了Objective C委托

来自分类Dev

Swift-Objective-C加载类方法?

来自分类Dev

在Swift中重写Objective C类方法

来自分类Dev

在Objective C标头中访问Swift类

来自分类Dev

从Objective C中的Swift类继承

来自分类Dev

Swift 中的 Objective C 类方法调用

来自分类Dev

iOS从Swift使用框架导入Swift类

来自分类Dev

从Swift类访问Objective-c基类的实例变量

来自分类Dev

在目标C和Swift中使用Singleton类