循环引用,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的主要内容,如果未能解决你的问题,请参考以下文章