【问题标题】:When importing Swift class into Obj-C: Property not found on object of type将 Swift 类导入 Obj-C 时:在类型的对象上找不到属性
【发布时间】:2019-06-28 19:34:43
【问题描述】:

我正在创建一个通过蓝牙与外围设备通信的 iOS 应用。蓝牙设备的 API 是用 Objective-C 编写的,所以我选择编写我的 AppDelegate 和 ViewController 也是用 Objective-C 编写的。我还开发了一个 CoreML 算法,我选择与 Swift 中的模型进行交互(XCode 自动生成一个名为 Model 的 Swift 类)。从那里,我创建了第二个名为 Predictor 的 Swift 类,它有一个名为 predict 的方法,它返回包含在 Model. 中的 ML 算法的结果但是,当我将 Predictor Swift 类导入到我的 Objective- C 视图控制器,XCode 似乎无法访问其predict 方法。

我是 Objective-C 和 Swift 的新手,但我认为我对类结构有一个具体的理解。我已经尝试了这么多事情,在这一点上,我只是猜测。我一定对 Swift/Objective-C 有一个根本性的误解,但我无法识别它。

我在 Swift 中的 Predictor 类暴露于 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 内部的 predict 方法@ 类实例 @ 987654333@,但返回如下错误信息:Property 'predict' not found on object of type 'Predictor *'

【问题讨论】:

    标签: ios objective-c swift


    【解决方案1】:

    _myModel.predict(data: modelInputs) 无法工作。您正在尝试在 Objective-C 中使用 Swift 语法。

    在 Objective-C 中调用方法的语法是不同的。实际上,即使方法名称也不同。你的电话应该是这样的:

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

    【讨论】:

    • 感谢 Sulthan 礼貌、简单、快速的回复。您当然已经解决了我在 Objective C 中使用 Swift 语法的问题。但是,我的代码现在返回以下错误:No visible @interface for 'Predictor' declares the selector 'predict'(这也适用于选择器predictDatapredictdata。我确实描述了里面的“预测”方法我的'Predictor'类...也许Objective-C中的方法名称不同?
    • @MatthewAnderson 你在哪里使用predict?我使用了predictData,因为这就是Swift 函数predict(data:) 将被转换的方式。还要注意Swift中的函数应该是public
    • 我测试了predictpredictData这两个选择器的使用。此外,我将我的 Swift 类 Predictor 和函数 predict 更改为 public。我相信我确实通过#import "SeizureSense-Swift.h" 将Swift 标头正确导入到ViewController.m,这与我在构建设置中的Objective-C Generated Interface Name 匹配。我仍然面临错误:No visible @interface for 'Predictor' declares the selector 'predictData'
    • @MatthewAnderson 这很奇怪。无论如何,在输入 [_myModel 之后,您应该在 predictor 上完成代码
    • 哦,这当然是可能的 :) 顺便说一句,如果您想更改名称,可以使用 @objc(predictData) 控制名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2012-03-04
    • 2018-01-21
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多