При импорте класса Swift в Obj-C: свойство не найдено для объекта типа - PullRequest
0 голосов
/ 28 июня 2019

Я создаю приложение для iOS, которое связывается с периферийным устройством через Bluetooth. API устройства Bluetooth написан на Objective-C, поэтому я решил написать, что мой AppDelegate и ViewController также написаны на Objective-C. Я также разработал алгоритм CoreML, который я выбрал для взаимодействия с этой моделью из Swift (для меня XCode автоматически генерирует класс Swift с именем Model). Оттуда я создал второй класс Swift с именем Predictor, в котором есть метод с именем predict, который возвращает результат алгоритма ML, содержащегося в Model. Однако, когда я импортировал класс Predictor Swift в свой Objective- C контроллером представления, XCode, кажется, не мог получить доступ к его predict методу.

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

Мой класс Predictor в Swift открыт для Objective-C и наследуется от NSObject, но не имеет функции init () (я не думаю, что она необходима?).

@objcMembers class Predictor: NSObject {

    let model = Model();

    @objc func predict(data: [Double]) -> Int64 {
        isPreictal = model.prediction(input: data)
        return isPreictal.classLabel
    }
}

ViewController.h

@class Predictor;
@interface ViewController : UIViewController
< IXNMuseConnectionListener, IXNMuseDataListener, IXNMuseListener, IXNLogListener>
- (IBAction)compute:(id)sender;
- (Predictor *)returnSwiftObject;
- (void)applicationWillResignActive;
@end

ViewController.m

#import "ViewController.h"
#import "SeizureSense-Swift.h"

@interface SimpleController () <CBCentralManagerDelegate>
@property (nonatomic, strong) Predictor * myModel;

double modelInputs[30];

- (void)viewDidLoad { _myModel = [Predictor new]; }

- (IBAction)compute:(id)sender {
    [self log:@"%d", _myModel.predict(data: modelInputs)];
}
@end

Поскольку мой класс Swift Predictor импортируется в ViewController.h, а мой заголовок SeizureSense-Swift импортируется в ViewController.m, я ожидаю, что смогу получить доступ к методу predict внутри Predictor экземпляра класса myModel, но возвращается следующее сообщение об ошибке: Property 'predict' not found on object of type 'Predictor *'

1 Ответ

1 голос
/ 28 июня 2019

_myModel.predict(data: modelInputs) не может работать. Вы пытаетесь использовать синтаксис Swift в Objective-C.

В Objective-C синтаксис для вызова методов отличается. На самом деле, даже имена методов разные. Ваш звонок должен быть примерно таким:

[self log:@"%d", [_myModel predictWithData:modelInputs]];
...