Категории ObjC не распознаются из другой целиIOS

Программируем под IOS
Ответить
Гость
 Категории ObjC не распознаются из другой цели

Сообщение Гость »

У меня есть проект iOS SwiftUI со следующей иерархией:

Код: Выделить всё

Module hierarchy:

AppTarget -> depends on Experience
Experience -> depends on Lifecycle
Lifecycle

Content of each module:
Lifecycle
-- struct conforming App protocol (entry point)
-- AppDelegate, SceneDelegate etc.
Experience
-- URLHandler (and other supporting classes to handle launch parameters (if app is launched by tapping an associated file, quick action etc..) and update the UI.
У меня есть структура, соответствующая протоколу приложения, в библиотеке Lifecycle. Он определяет метод onOpenURL(perform:) для обработки всех запусков на основе URL-адресов (виджетов, файлов, глубоких ссылок, универсальных ссылок и т. д.).

Код: Выделить всё

// In Lifecycle library

WindowGroup {
ContentView()
.onOpenURL(perform: { (url: URL) in
// Handle URL with which the app is launched.
})
}
В приведенном выше методе мне нужно вызвать метод обработчика URL-адресов в библиотеке Experience. Обратите внимание, что библиотека Experience находится над Lifecycle в иерархии (как упоминалось выше), поэтому я не могу просто вызвать ее напрямую.
Я подумываю об использовании Категории ObjC для достижения этой цели. Категория ObjC — это способ добавить методы в существующий класс. Во время выполнения все методы в категории будут относиться к одному классу, хотя они определены в двух файлах в разных модулях.
В библиотеке Lifecycle я определяю класс как ниже:

Код: Выделить всё

// In header file,
@interface  URLHandler : NSObject

// No methods defined here.
// Experience extends this using the concept of
// ObjC category and defines a handler method
// to handle all URL handler launches.

@end

// In .mm file,
@implementation URLHandler

// Empty

@end
А в библиотеке Experience я расширяю их, как показано ниже:

Код: Выделить всё

// In header file, extend the base class in Lifecycle library
// by creating a category.
@interface URLHandler (Experience)

+ (void) handleURL:(NSURL *) url;

@end

// In .mm file,
@implementation URLHandler (Experience)

+ (void) handleURL:(NSURL *) url {
Log([NSString stringWithFormat:@"(ObjC++) url = %@", [url absoluteString]]);

// Update the UI after 'understanding' the URL.
}

@end

И в методе onOpenURL(perform:) вызовите метод handleURL:

Код: Выделить всё

WindowGroup {
ContentView()
.onOpenURL(perform: { (url: URL) in
URLHandler.handleURL(url)
})
}
Насколько я понимаю, все нормально... но возникает ошибка компиляции

Код: Выделить всё

Type 'URLHandler' has no member 'handleURL'
Разве категория не является функцией времени выполнения? Во время выполнения метод handleURL: должен быть частью URLHandler. Но как мне обойти эту ошибку во время компиляции?
Разве это невозможно с помощью ObjC? Если да, есть ли другой способ?
Edit1: я использую последнюю версию взаимодействия Cpp-Swift, представленную в WWDC 2023, которая использует карту модулей для предоставления Swift типов C++ и ObjC. Я считаю, что сделал это правильно, поскольку ошибка - это не > неопределенный символ: URLHandler
, а метод, недоступный в классе, который я реализовал в категории.

Подробнее здесь: https://stackoverflow.com/questions/781 ... ent-target
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»