Невозможно вызвать бросаемую функцию Swift из Objective- C - PullRequest
0 голосов
/ 10 марта 2020

Класс написан на 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
    }
}

Из этих функций только первая функция компилируется.

Ошибки компиляции других функций,

testOptionalBoolean : Метод не может быть помечен @ obj c, поскольку его тип результата не может быть представлен в Objective- C

testThrowableBoolean : Метод метания не может быть помечен @ obj c, поскольку он возвращает значение типа «Bool»; вернуть 'Void' или тип, который соединяется с Objective- C class

testThrowableOptionalBoolean : Метод не может быть помечен @ obj c, потому что его тип результата не может быть представлен в Objective- C

Как правильно сделать все функции доступными для абонентов obj c?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

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
    }
}
1 голос
/ 10 марта 2020

Сообщения об ошибках совершенно ясны:

  1. Необязательный скалярный тип нельзя использовать в качестве возвращаемого типа в Obj C, поскольку только объекты nullable.
  2. To быть в состоянии преобразовать throw ing функцию Swift в синтаксис Obj C inout NSError, тип возвращаемого значения должен быть AnyObject (класс) в терминах Swift.

Вы можете замените типы Bool на NSNumber, например

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

, но даже с NSNumber функция testThrowableOptionalBoolean не компилируется, потому что конструкция функции выброса должна возвращать необязательный параметр на успех

...