Платформа Objective C для приложения swift, ошибка: аргумент передан вызову, который не принимает аргументов

#ios #swift #objective-c #bridging-header

#iOS #swift #objective-c #мостовой заголовок

Вопрос:

Я создаю фреймворк objective C для приложения swift. Я пытаюсь использовать функцию в swift с помощью импортируемого файла заголовка objective C.

 interface MyApi : NSObject

  (void)init:(NSDictionary *)launchOptions;

@end
 
 @implementation MyApi

  (void)init:(NSDictionary *)launchOptions {
    ...
}
@end
 

Это файлы .h и .m в obj C. В swift я пытаюсь вызвать функцию следующим образом:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        MyApi.init(launchOptions)
        return true
    }
 

Но я продолжаю получать сообщение об ошибке: аргумент передан вызову, который не принимает аргументов

в строке я вызываю функцию. Есть мысли?

Ответ №1:

Этот синтаксис:

 MyApi.init(launchOptions)
 

вызывает инициализатор MyApi . Обратите внимание, что init это ключевое слово в Swift и имеет особое значение! Поскольку MyApi наследуется от NSObject , он наследует инициализатор без параметров, который, по мнению компилятора Swift, вы пытаетесь вызвать. Это то же самое, что:

 MyApi(launchOptions)
 

Однако ваш init метод в Objective-C не является инициализатором для MyApi объекта, не так ли? Это просто обычный вызываемый метод класса init . Чтобы вызвать его в Swift, вам нужно избежать особого значения init ключевого слова, добавив вокруг него обратные знаки:

 MyApi.`init`(launchOptions)
 

Обратные ссылки довольно удивительны, поэтому я бы посоветовал вам переименовать init во что-то другое, например setup .

Комментарии:

1. Я бы переименовал метод Objective-C или предоставил другой синтаксис в Swift. Но даже на Objective-C я бы переименовал его, поскольку это немного сбивает с толку.