【问题标题】:Throwing method cannot be a member of an @objc protocol because it returns a value of type 'Bool'抛出方法不能是 @objc 协议的成员,因为它返回类型为“Bool”的值
【发布时间】:2016-06-22 13:29:58
【问题描述】:

我收到以下错误:

Throwing method cannot be a member of an @objc protocol because it returns a value of type 'Bool'; return 'Void' or a type that bridges to an Objective-C class

定义 Swift 协议时也需要桥接到 Objective-C:

@objc public protocol Saving {

    func save() throws -> Bool
}

是否有其他方法可以定义 Swift 方法,该方法可以返回 Bool,可能会引发错误并与 Objetive-C 兼容?

【问题讨论】:

  • 为什么要返回一个 Bool throw?通过返回真/假或抛出来指示成功/失败。 – func save() throws 将被转换为 Objective-C 为 - (BOOL)saveAndReturnError:(NSError **)error;
  • “Using Swift with Cocoa and Objective-C”文档不清楚Swift函数抛出错误是否会转换为Objective-C方法返回BOOL。
  • 我现在实际测试了一下,查看了Swift生成的头文件,你是对的。

标签: objective-c swift error-handling throw


【解决方案1】:

如 cmets 所示,Swift 中的以下内容:

func save() throws

将被翻译成:

(BOOL)saveAndReturnError:(NSError **)error

在 Objective-C 中。这解释了限制。

我知道在save() 示例中,返回Bool 以及投掷可能没有多大意义,但我不同意关于它根本没有意义的评论。可能还有其他有意义的用例。外汇。反例;使用标识符加载Bool。如果加载失败,加载 Bool 可能会返回 true/falsethrow,fx。如果尝试加载时找不到标识符。

但不幸的是,由于 Swift 和 Objective-C 的桥接方式,我们无法做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多