Swift类导入Objective-C后提示‘predict属性未找到’问题求助
解决Objective-C调用Swift Predictor类方法的问题
首先咱们拆解下你遇到的几个核心问题,都是Swift和Objective-C交互里的常见新手坑,一步步来解决:
1. 先修正Swift代码里的语法错误
你的predict方法里isPreictal变量没提前声明,这会导致Swift代码编译失败,更没法给Objective-C调用。先补上这个变量:
@objcMembers class Predictor: NSObject { let model = Model(); @objc func predict(data: [Double]) -> Int64 { // 补上变量声明,匹配Model的prediction返回类型 let isPreictal = model.prediction(input: data) return isPreictal.classLabel } }
2. 修正Objective-C的方法调用语法
你在compute:里用了Swift风格的调用写法_myModel.predict(data: modelInputs),但Objective-C有自己的方法调用规则:
- Swift的
predict(data:)方法暴露到Objective-C后,会被自动命名为predictWithData: - Objective-C调用方法必须用中括号+选择器的语法,不能用Swift的点语法
- 另外你定义的
modelInputs是C风格数组,和Swift方法要求的[Double](Swift数组)类型不匹配,需要先转成NSArray
修正后的compute:方法如下:
- (IBAction)compute:(id)sender { // 把C风格double数组转换成NSArray<NSNumber *> NSMutableArray *inputArray = [NSMutableArray arrayWithCapacity:30]; for (int i = 0; i < 30; i++) { [inputArray addObject:@(modelInputs[i])]; } // 用Objective-C的方法调用语法 Int64 result = [_myModel predictWithData:inputArray]; // Int64对应Objective-C的%lld格式符,不要用%d [self log:@"%lld", result]; }
3. 确认Swift类的暴露配置
你已经给Predictor加了@objcMembers并继承NSObject,这部分是对的,但可以再检查两个点:
- 项目Build Settings里的
Objective-C Generated Interface Header Name确实是SeizureSense-Swift.h(和你导入的一致) - 打开
SeizureSense-Swift.h文件,确认里面已经生成了Predictor类和predictWithData:方法的声明(如果没生成,清理缓存重新编译试试)
可选优化:让参数传递更直接
如果不想每次都手动转数组,可以修改Swift方法的参数类型为NSArray,这样Objective-C调用更省心:
@objc func predict(data: NSArray) -> Int64 { // 把NSArray转成Swift需要的[Double] let swiftData = data.compactMap { ($0 as? NSNumber)?.doubleValue } let isPreictal = model.prediction(input: swiftData) return isPreictal.classLabel }
最后记得先清理Xcode缓存(Cmd+Shift+K),再重新编译项目,应该就能解决Property 'predict' not found的错误了——本质是Objective-C和Swift的方法调用语法差异,加上参数类型不匹配导致的。
内容的提问来源于stack exchange,提问作者Matthew Anderson
相关产品推荐
相关产品推荐

