Создание объекта в Swift с использованием фабричного метода Objective C дает ошибку компилятора

Я пытаюсь инициировать последовательное соединение с помощью ORSSerialportСерийная библиотека Objective-C. Я уже успешно использовал его, чтобы найти все последовательные порты, но у меня проблемы с открытием соединения.

Документация показывает открытие порта как таковое:

ORSSerialPort *serialPort = [ORSSerialPort serialPortWithPath:@"/dev/cu.KeySerial1"];

Я написал следующее:

let serialPort: ORSSerialPort.serialPortWithPath(serialListPullDown.selectedItem)

Тем не менее, Xcode не выполняет автозаполнение моего метода и не будет компилироваться. Дает мне ошибку "serialPortWithPath не является членом типа ORSSerialport". У меня правильно установлен мостовой заголовок, и я уже использовал другой класс в той же библиотеке с похожим синтаксисом без проблем. Что здесь произошло?

1 ответ

Решение

Краткий ответ: создайте объект с

let serialPort = ORSSerialPort(path:"/dev/cu.KeySerial1")

Детали: фабричный метод Objective-C

+ (ORSSerialPort *)serialPortWithPath:(NSString *)devicePath;

сопоставлен с Swift как

init!(path devicePath: String!) -> ORSSerialPort

Это описано в разделе "Взаимодействие с API-интерфейсами Objective-C" (спасибо Nate Cook!):

Для согласованности и простоты фабричные методы Objective C отображаются как удобные инициализаторы в Swift. Это отображение позволяет использовать их с тем же кратким и понятным синтаксисом, что и инициализаторы.

Это означает, что фабричный метод сопоставлен с тем же методом Swift, что и метод init Objective-C

- (id)initWithPath:(NSString *)devicePath;

Оба будут называться из Swift как

let serialPort = ORSSerialPort(path:"/dev/cu.KeySerial1")

и получается, что это вызывает метод init. Как следствие, фабричный метод не может быть вызван из Swift.

Другие вопросы по тегам