代码之家  ›  专栏  ›  技术社区  ›  Sazzad Hissain Khan

无法从Objective-C调用可抛出的Swift函数

  •  0
  • Sazzad Hissain Khan  · 技术社区  · 6 年前

    类是用Swift编写的,

    @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
        }
    }
    

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

    其他函数编译器错误,

    testOptional布尔值 :方法不能标记为@objc,因为其结果类型无法在Objective-C中表示

    testThrowable布尔值 :抛出方法不能标记为@objc,因为它返回的值类型为'Bool';返回'Void'或连接到Objective-C类的类型

    testThrowable可选布尔值 :方法不能标记为@objc,因为其结果类型无法在Objective-C中表示

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

    0 回复  |  直到 6 年前
        1
  •  1
  •   vadian    6 年前

    错误消息非常清楚:

    1. 可选标量类型不能用作ObjC中的返回类型,因为只有对象 nullable .
    2. 为了能够转换a throw 将Swift函数移植到ObjC输入输出中 NSError 语法返回类型必须为 AnyObject (一个类)在Swift中。

    您可以更换 Bool 类型与 NSNumber 例如

    @objc func testOptionalBoolean() -> NSNumber? {
        return true // Yes, returning a Swift Bool is valid
    }
    

    但即使有 数字对象 功能 testThrowableOptionalBoolean 不编译,因为投掷函数的设计是在成功时返回非可选值

        2
  •  1
  •   emrcftci    6 年前

    SE-0230 修改方式 try? 其工作原理是将嵌套的可选项扁平化为常规可选项。这使得它的工作方式与可选链接和条件类型转换相同,这两种类型转换都会使早期Swift版本中的可选项变平。

    Hackingwithswift Article


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

    @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)
        }
    }
    

    使用方法

    if let wrapper = try? test.testThrowableBoolean() {
        print(wrapper.bool)
    }
    

    包装材料

    @objc class BooleanWrapper: NSObject {
    
        let bool: Bool
    
        init(_ bool: Bool) {
            self.bool = bool
        }
    }