【问题标题】:Objective-C Closure to use Swift enum使用 Swift 枚举的 Objective-C 闭包
【发布时间】:2020-03-02 17:03:36
【问题描述】:

我有这样的 Swift 枚举:

@objc public enum Status: Int {

    case unknown;
    case ok;
    case failed;
}

它已正确桥接到 Objective-C,我可以将它用作 Objective-C 中的 StatusUnknown

现在我有了一个回调函数:

+ (void)fetch:(void (^_Nonnull)(BOOL success))completion 

我只想用我的Status 枚举替换BOOL。该怎么做?

显然不是这样的:

+ (void)fetch:(void (^_Nonnull)(Status success))completion // Error: Unknown type name

我可以像这样使用NSInteger

+ (void)fetch:(void (^_Nonnull)(NSInteger success))completion

但它并没有真正限制 Status 枚举的值。

那么在这里传达枚举的最佳方式是什么?

注意:

  • 我简化了问题,实际上枚举不称为状态,并且具有更多值。
  • 函数的签名必须与之前的签名匹配,但参数不同

【问题讨论】:

  • 我不知道objective-C,但是我写了一些Swift代码并查看了生成的头文件。我看到枚举被转换为带有 typedef typedef SWIFT_ENUM(NSInteger, Status, closed) { StatusUnknown = 0, StatusOk = 1, StatusFailed = 2, };enum Status : NSInteger;,并且接受闭包的方法变为- (void)f:(void (^ _Nonnull)(enum Status))c;。这行得通吗?

标签: objective-c swift enums


【解决方案1】:

要兼容objective-c,枚举必须继承自Int,比如

@objc public enum Status: Int {
    case unknown
    case ok
    case failed
}

确保生成的桥头文件“YOURPROJECT-Swift.h”包含

typedef SWIFT_ENUM(NSInteger, Status, closed) {
  StatusUnknown = 0,
  StatusOk = 1,
  StatusFailed = 2,
};

然后在你的 .m 文件中

#import "YOURPROJECT-Swift.h"

...

+ (void)fetch:(void (^_Nonnull)(Status success))completion
{
    // do anything needed    
}

清理/构建 - 全部编译好。使用 Xcode 11.2 测试。

【讨论】:

  • 抱歉,我忘记指出它已经存在了。虽然它是在代码中。仍然出现错误。但是你说的是这种方法应该有效。我想我需要挖掘其他东西......
  • 在 Swift 中定义枚举并在 .h 文件中添加 typedef SWIFT_ENUM(NSInteger, Status, closed) 对我有用
猜你喜欢
  • 1970-01-01
  • 2015-10-14
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多