【问题标题】:How to acess swift 5 Result enum type in objective-c如何在objective-c中访问swift 5 Result枚举类型
【发布时间】:2020-12-14 00:11:46
【问题描述】:

我在swift-5中写了一个类方法,它的参数是Result类型,现在我想在objective-c中使用这个方法,可以吗?如果是,怎么做?

@objc public class DemoClass :NSObject {

    @objc public func demoMethod(completion: @escaping (Result<UIImage,Error>) -> 
     Void) {
             //some codes
      }
}

一旦我将@objc 添加到方法中,它就会抛出一个错误:方法不能被标记为@objc,因为参数的类型不能在Objective-C 中表示

【问题讨论】:

  • 错误信息应该很清楚:“参数的类型 (Result&lt;UIImage, Error&gt;) 不能在 Objective-C 中表示”。所以不,您不能从 Objective-C 访问它,因为它在那里无法表示。你可以做的是,(UIImage?, Error?) -&gt; Void 就像许多 Objective-C API 一样。
  • 这是我要做的最后一件事,最初,我想尽可能用最少的代码扩展/继承 Result 顶部的枚举,然后在 swift 中使用它并在 Objective-C 中访问
  • 你不能,这是我对一个问题(基于意见)的评论,询问作者是否需要删除其所有先前的完成闭包并用 Result 替换它们。您可以为 Objective-C 使用“旧版”方法,但这会添加您的代码,例如带有 (UIImage?, Error?) -&gt; Void 的代码,并在内部调用带有 Result 的代码。

标签: ios objective-c swift5


【解决方案1】:

在 Objective-C 中无法访问枚举结果。这是@frozen 而不是@inlinable

Objective-C 枚举也不能是通用的,即 Result&lt;Success, Failure&gt; where Failure: Error 不能暴露给 Objective-C。

那么,你可以做一个如下的类,并根据需要做其他事情:

@objc class AResult: NSObject {
    
    public private(set) var success: Any?
    public private(set) var failure: Error?
    
    private override init() {
        super.init()
        success = nil
        failure = nil
    }
    
    public convenience init<Success, Failure>(_ arg1: Success, _ arg2: Failure) where Failure: Error {
        self.init()
        success = arg1
        failure = arg2
        // Do something
    }
}

并声明你的函数:@objc func demoMethod(_ completion: (AResult) -&gt; Void) {}

希望这会有所帮助。

【讨论】:

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