Добавление Objective C SDK в Swift 4.1 SDK

avatar
jjlei
8 апреля 2018 в 07:36
119
1
-2

У меня есть сторонний SDK Objective-c, который я хочу добавить в свой пользовательский SDK Swift. Я умею их комбинировать, а также использую некоторые методы. Однако, когда дело доходит до приватных методов внутри Objective-c SDK, он продолжает возвращать мне сообщение об ошибке «Использование необъявленного типа». Спасибо!

Сторонний класс target-c

@class CardReader, MeaningfulError, BluetoothDevice, DeviceEventDispatch, DeviceController;
@interface CardReaderController : NSObject

@property (nonatomic, readonly, nullable) CardReader *connectedReader;
@property (nonatomic, readonly, nullable) DeviceEventDispatch *eventDispatch;


+ (instancetype _Nonnull )sharedController;

- (BOOL)isReaderConnected;
- (void)connectAudioReader;
- (void)connectBTReader:(void (^ _Nullable)(NSArray<BluetoothDevice *> *_Nullable))availableBTReadersToConnectHandler;

- (void)disconnectReader;

@end

Мой пользовательский класс Swift 4.1

@objc public protocol HardwareDelegate: class {


@objc optional func connectDeviceCompleted (status :String, error :String)

@objc optional func disConnectDeviceCompleted (status :String, error :String)
}

open class HardwareCom: NSObject {

    public static let shared = HardwareCom()
    public weak var delegate : HardwareDelegate?

     //This method is working, calls the connectAudioReader method from third party Objective-c library
     open func connectAudioReader()
    {
        print("connecting to auduio Reader");
       CardReaderController.shared().connectAudioReader()
    }

    //This method is giving me error
    open func connectBluetoothReader()
    {
     // Getting Error here, (Use of undeclared type BluetoothDevice)
     CardReaderController.shared().connectBTReader({(_ readers: [BluetoothDevice]?) -> Void in
        print("Found BT devices --> \(readers ?? "")")
      })
   }

}

так вот BluetoothDevice.h

#import <CoreBluetooth/CoreBluetooth.h>

@interface BluetoothDevice : CBPeripheral

@end

Класс включен в SDK, но Swift по какой-то причине не может его найти.

Источник
jjlei
8 апреля 2018 в 07:56
0

Привет, я отредактировал свой вопрос. Это Фреймворки.

Cœur
8 апреля 2018 в 08:36
0

Убедитесь, что BluetoothDevice имеет значение @objc public (или @objc Open), а также нужные методы (например, init). Лучше покажите как код ObjC, так и код Swift.

jjlei
8 апреля 2018 в 15:42
0

Спасибо за отзыв, я отредактировал свой вопрос, чтобы показать оба класса.

matt
8 апреля 2018 в 15:47
0

Нет, вы не показали, как и где объявляется BluetoothDevice. Похоже, вы просто забыли импортировать "BluetoothDevice.h" в заголовок быстрого соединения.

jjlei
8 апреля 2018 в 16:11
0

BluetoothDevice не включен в стороннюю библиотеку, поэтому я предполагаю, что это частный класс. Я не вижу BluetoothDevice нигде в SDK Objective-c

Ответы (1)

avatar
matt
8 апреля 2018 в 15:49
0

У вас есть соединительный заголовок Swift, состоящий из операторов #import для файлов заголовков Objective-C. Похоже, вы забыли импортировать "BluetoothDevice.h" или любой другой файл заголовка Objective-C, объявляющий BluetoothDevice.

jjlei
8 апреля 2018 в 16:12
0

Я сам создаю пользовательский SDK. Таким образом, нет необходимости использовать заголовочные файлы Bridge, поэтому мне просто нужно убедиться, что модули включены в настройках. Я могу использовать все общедоступные классы. BluetoothDevice.h, я не могу найти его нигде в стороннем SDK Objective-C, который, как я предполагаю, является частным классом.

matt
8 апреля 2018 в 17:48
0

Дело не в "приватности", а в видимости. Вам нужно импортировать что-то, которое либо является файлом, в котором объявлен BluetoothDevice, либо импортирует его. В противном случае ваш код Swift не знает об этом.

jjlei
8 апреля 2018 в 21:20
0

Я использую стороннюю платформу SDK. Я не могу найти класс объявления BluetoothDevice где-либо внутри стороннего SDK, кроме того, что он вызывается CardReaderController. Когда я использую приложение Objective-c для тестирования стороннего SDK, я могу получить доступ к BluetoothDevice, но как только я перешел на Swift, Swift не может найти BluetoothDevice, в seift я могу получить доступ ко всем другим классам, поэтому мост это не проблема, поэтому мне было интересно, могут ли быть какие-то другие настройки, которые мне нужно изменить в настройках моего быстрого проекта.

matt
8 апреля 2018 в 21:49
0

Ну, очевидно, было бы намного проще ответить на этот вопрос, если бы вы сказали нам, что это за структура, чтобы мы могли убедиться сами. Как бы то ни было, вы просто просите предположить. Я предполагаю, что вам просто не повезло: API этого фреймворка не построен таким образом, чтобы сделать класс BluetoothDevice доступным из Swift. Вы можете попросить того, кто написал фреймворк, изучить это. Между тем, как вы уже намекнули, вам, возможно, придется написать эту часть кода на Objective-C.

matt
8 апреля 2018 в 22:37
0

Ну, мне не ясно, что мы что-то решили. Было бы очень полезно увидеть рассматриваемую структуру... У меня есть ощущение, что Swift пришел и поймал эту структуру со спущенными штанами, если вы понимаете, что я имею в виду.

jjlei
11 апреля 2018 в 14:54
0

Спасибо @matt. Я обновил вопрос, включив в него класс, так как он теперь доступен в SDK. SDK предназначен для anywherecommerce.com.

matt
11 апреля 2018 в 16:04
0

Но ANPBluetoothDevice != BluetoothDevice. Я не понимаю.

matt
11 апреля 2018 в 16:06
0

Похоже, что общедоступной документации нет, поэтому я больше ничем не могу помочь, извините.

jjlei
11 апреля 2018 в 18:16
0

Да, да, их документ не очень полезен, поэтому я тоже застрял, пробуя и ошибаясь. Это было моей ошибкой, должно быть BluetoothDevice. Спасибо!

matt
11 апреля 2018 в 18:50
0

Итак, вы говорите, что делаете видите файл с именем BluetoothDevice.h во фреймворке? Тогда мой ответ правильный: вам нужно import этот файл в заголовке моста. Может нужно написать #import <MyFramework/BluetoothDevice.h>, может нужно задать пути поиска заголовков в настройках сборки, не знаю.

jjlei
11 апреля 2018 в 18:56
0

Да, я вижу BluetoothDevice.h после того, как они его раскрывают. Я попытался сделать <MyFramework/BluetoothDevice.h> в моем заголовке моста, он возвращает ту же ошибку, по какой-то причине он не может найти этот класс. Я могу использовать все классы, наследующие NSObject, за исключением BluetoothDevice.h, который наследует CBPeripheral, происходящий от Apple CoreBluetooth SDK. Хорошо Спасибо за помощь!

matt
11 апреля 2018 в 18:59
0

Как я уже сказал, я не могу загрузить эту структуру, поэтому я не могу ее попробовать. Но наверняка другие используют его????

jjlei
11 апреля 2018 в 19:07
0

В этом я не уверен, но да, худшее происходит при переносе моего быстрого кода на Objective-C, который я тестировал, он работает.