首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法从目标C调用可抛出的Swift函数

无法从目标C调用可抛出的Swift函数
EN

Stack Overflow用户
提问于 2020-03-10 06:26:24
回答 2查看 357关注 0票数 0

类是用Swift写的,

代码语言:javascript
代码运行次数:0
运行
复制
@objc class Test: NSObject {

    @objc func testBoolean() -> Bool {
        return true
    }

    @objc func testOptionalBoolean() -> Bool? {
        return true
    }

    @objc func testThrowableBoolean() throws -> Bool {
        return true
    }

    @objc func testThrowableOptionalBoolean() throws -> Bool? {
        return true
    }
}

在这些函数中,只有第一个函数是可编译的。

其他函数编译器错误,

testOptionalBoolean:方法不能标记为@objc,因为它的结果类型不能用Objective表示。 testThrowableBoolean:抛出方法不能标记为@objc,因为它返回‘Bool’类型的值;返回'Void‘或连接到目标-C类的类型。 testThrowableOptionalBoolean:方法不能标记为@objc,因为它的结果类型不能用Objective表示。

使所有函数对objc调用者可用的正确方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2020-03-10 08:08:15

错误信息非常清楚:

  1. 在ObjC中,可选标量类型不能用作返回类型,因为只有对象是nullable
  2. 为了能够将throwing Swift函数转换为ObjC inout NSError语法,返回类型必须是AnyObject (类)。

例如,可以将Bool类型替换为NSNumber

代码语言:javascript
代码运行次数:0
运行
复制
@objc func testOptionalBoolean() -> NSNumber? {
    return true // Yes, returning a Swift Bool is valid
}

但是,即使使用NSNumber,函数testThrowableOptionalBoolean也不会编译,因为抛出函数的设计是在成功时返回一个非可选函数。

票数 1
EN

Stack Overflow用户

发布于 2020-03-10 08:24:27

硒-0230修改了try?的工作方式,从而使嵌套选项变平,成为常规选项。这使得它的工作方式与可选链接和条件类型转换相同,在早期的Swift版本中,这两种类型都是扁平的选项。

用迅捷的文章

您可以创建一个对象作为包装器。

代码语言:javascript
代码运行次数:0
运行
复制
@objc class Test: NSObject {

    @objc func testBoolean() -> Bool {
        return true
    }

    @objc func testOptionalBoolean() -> BooleanWrapper? {
        return BooleanWrapper(true)
    }

    @objc func testThrowableBoolean() throws -> BooleanWrapper {
        return BooleanWrapper(true)
    }
}

使用

代码语言:javascript
代码运行次数:0
运行
复制
if let wrapper = try? test.testThrowableBoolean() {
    print(wrapper.bool)
}

包装器

代码语言:javascript
代码运行次数:0
运行
复制
@objc class BooleanWrapper: NSObject {

    let bool: Bool

    init(_ bool: Bool) {
        self.bool = bool
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60612487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档