#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 я бы переименовал его, поскольку это немного сбивает с толку.