it-swarm.com.ru

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

выставляю Swift API в Objective-C и во время выполнения Objective-C.

Когда я добавляю «@objc» перед тем, как функция выдает ошибку «Метод не может быть помечен как @objc, потому что его тип результата не может быть представлен в Objective-C»

Мой код здесь

@objc public static func logIn(_ userId: String) -> User? { }

Пользователь является необязательной структурой. как решить это.

6
SriMa

Ключевой бит информации таков:

Пользователь является необязательной структурой

Если User является структурой, то она не может быть представлена ​​в Objective-C, точно так же, как класс Swift, который не наследуется от NSObject.

Чтобы метод logIn(_:) можно было пометить @objc, каждый тип, на который есть ссылка в объявлении метода, должен быть представлен в Objective-C. Вы получаете сообщение об ошибке, потому что User нет.

Чтобы это исправить, вам нужно либо изменить объявление User из этого:

struct User {
    // ...
}

...к этому:

class User: NSObject {
    // ...
}

... или перепроектировать logIn(_:), чтобы он не возвращал User.


Вы можете найти больше информации об этом здесь . В частности, этот ответ предлагает следующее потенциальное решение:

Лучшее, что я нашел, - это завернуть в класс Box

public class Box<T>: NSObject {
    let unbox: T
    init(_ value: T) {
        self.unbox = value
    }
}
3
Søren Mortensen

Измените определение вашего класса, как показано ниже

class User: NSObject {

}

Таким образом, этот класс будет доступен в Objective-C

1
Inder Kumar Rathore

Ваш класс или протокол должен наследоваться (расширяться) NSObject или любым другим классом в его иерархии, содержащим ваш код (функцию) с нотацией @objc.

Пример:

class TestClass {
    public static func logIn(_ userId: String) -> User? { }
}

Чтобы использовать/объявить @objc с этой функцией, класс должен расширять NSObject (или любой другой класс в его иерархии)

class TestClass {
    @objc public static func logIn(_ userId: String) -> User? { }
}

Обновление:

struct может не работать с необязательным значением в Objective-C, в качестве обходного пути вы должны изменить User с struct на class

Попробуйте следующий код и посмотрите:

public class User : NSObject {
    // Your code
}

public final class Manager : NSObject {

    @objc public static func logIn(_ userId: String) -> User? {
        return nil
    }
}

Вот снимок с редактором

 enter image description here

0
Krunal