【问题标题】:Resolving Swift.h and Bridging-Header.h circular references involving enums解决涉及枚举的 Swift.h 和 Bridging-Header.h 循环引用
【发布时间】:2018-03-22 04:20:09
【问题描述】:

我有一个 Swift 类必须使用的 Objective-C 标头。但是,此标头必须使用 Swift.h 文件作为 Swift 文件中声明的枚举。也就是说,设置如下:

MPViewController.h

#import "MyProject-Swift.h"

@interface MPViewController: UIViewController

@property (nonatomic, assign) MPSomeEnum theEnum;
...

@end

MyProject-Bridging-Header.h

...    
#import "MPViewController.h"
...

SomeEnum.swift

@objc enum MPSomeEnum: Int {
    ...
}

编译代码时出现三个错误:

  • 找不到“MyProject-Swift.h”文件
  • 未能发出预编译头 [Xcode DerivedData folder]/[...]/MyProject-Bridging-Header-swift_[...].pch 用于桥接头 [Project folder]/MyProject-Bridging-Header.h
  • 未知类型名称“MPSomeEnum”

假设这源于MyProject-Swift.h 和桥接头MyProject-Bridging-Header.h 之间的循环引用,我是否正确?通过查看similar question,一种解决方案是使用前向声明。但是,似乎不可能转发声明一个枚举,所以这样做的唯一方法可能是将枚举定义完全移动到一个 Objective-C 文件中?

【问题讨论】:

    标签: objective-c swift enums language-interoperability


    【解决方案1】:

    TL&DR; 正如您所怀疑的,您需要将枚举声明移动到 Objective-C,或者将类迁移到 Swift。

    在 Objective-C 中可以对枚举进行前向声明:

    @property SomeEnum someProperty;
    
    - (void)doSomethingWithEnum:(enum SomeEnum)enumValue;
    

    然而,正确的 Cocoa 枚举是 NSInteger:typedef NS_ENUM(NSInteger, MyEnum) 的类型定义,而 enum 关键字没有足够的信息来说明使用它时要分配多少空间,所以你会进入所有类型的编译器当你想使用这样的声明时出错。因此,Swift 中声明的枚举在 Objective-C 中是不可前向声明的。

    现在,如果您真的想在 Swift 中保留枚举定义,您可以使用一种变通方法,并在 Objective-C 中将其声明为 NSInteger,同时在 Swift 中提供一个专门的属性:

    // NS_REFINED_FOR_SWIFT imports this in Swift as __theEnum
    @property(nonatomic, assign) NSInteger theEnum NS_REFINED_FOR_SWIFT;
    
    extension MPViewController {
        // we provide a wrapper around the Objective-C property
        var theEnum: MPSomeEnum {
            // this uses a forced unwrap, beware :)
            return MPSomeEnum(rawValue: theEnum)!
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多