循环引用,Obj-C -> Swift,Swift -> Obj-C

Posted

技术标签:

【中文标题】循环引用,Obj-C -> Swift,Swift -> Obj-C【英文标题】:Circular reference, Obj-C -> Swift, Swift -> Obj-C 【发布时间】:2018-07-04 16:21:24 【问题描述】:

我正在尝试创建一个具有枚举类型属性的 Objc 类,其中枚举类型是在 swift 中创建的。之后,我想在 Swift 中使用 Objc 类。

(斯威夫特)枚举:

import Foundation

@objc enum AffectsUnit:Int 
    case time
    case person
    case group

(对象)类

#import "JSONModel.h"
#import "MyApp-Swift.h"
@interface AddPlayerToTime : JSONModel
@property (nonatomic) AffectsUnit affectsUnit;
@end

Objc 类有一个空的方法文件。

到目前为止,一切都很好。没有编译器警告。

因为我也想在 Swift 中使用我的 objc 类。我需要在我的 Bridging-Header.h 中导入该类。

#import "AddPlayerToTime.h"

现在我的 swift 代码可以看到 AddPlayerToTime 类,但项目将不再编译。我得到的错误是:

Unknown type name 'AffectsUnit'

我 99% 确定它会因为循环引用而中断。由于我的 swift 代码正在导入 AddPlayerToTime 类,而 AddPlayerToTime 正在导入我的 swift 代码。但我不知道如何解决这个问题。关于这个循环参考问题的所有帖子,似乎都建议使用@class 声明。但由于我试图引用一个枚举,而不是一个类,这对我来说不是一个解决方案。

我是不是想完成一些简单的事情做不到?

编辑1: 请注意:我希望尽可能多的代码保持在 Swift 端。

【问题讨论】:

看起来您可以对枚举进行前向声明,如果它适合您,请查看此链接。 ***.com/questions/946489/… 这将是 Objc 枚举,在 Swift 中可见,是吗?无需在您的 Bridging-Header 中导入标头。我想要实现的是相反的(使 Swift 枚举对 Objc 可见)。 【参考方案1】:

您应该能够将枚举声明移到 Obj-C 端,并且它仍然对 Swift 可见,如下所示:

typedef NS_ENUM(NSInteger, AffectsUnit)

    AffectsUnitTime,
    AffectsUnitPerson,
    AffectsUnitGroup
;

【讨论】:

这确实有效。是的,它直到 Swift 可见。有什么方法可以让它工作,同时在 Swift 端仍然有枚举?我问的原因是因为我正试图慢慢地从 Obj-C 迁移到更多地转向 Swift。我已经更新了我的帖子。 我用 swift 创建了我的 AddPlayerToTime 类。这让我可以将枚举保持在 swift 端,并且仍然可以在两个代码端使用。会 +1,因为我们的解决方案确实解决了我的编译器警告。 我已经有一段时间没有将应用程序移到 Swift 上了,但我记得由于这个确切的问题,我不得不最后移动枚举。 是的,有道理。我的逻辑是“Enum 似乎是一个不错的起点,因为它们非常容易快速地重新创建”。猜猜那是我在那里打的一个非常糟糕的电话。

以上是关于循环引用,Obj-C -> Swift,Swift -> Obj-C的主要内容,如果未能解决你的问题,请参考以下文章

Obj-C 的 Swift 桥接头

Obj-C 的 Swift 桥接头

将 Obj-C 桥接到 Swift 后缺少啥

在 Swift 中使用 Obj-C 完成块

Swift 的 Obj-c 代码 - NSDateFormatter [重复]

- (id) 来自 Swift 中的 Obj-C Lib?