在Obj-C类中找不到Swift协议声明

时间:2017-08-29 05:38:41

标签: objective-c swift3 swift-protocols

我已经在swift中创建了Class,并且我在Obj-C启用的项目中使用了该类及其协议,但是在编译项目时我遇到了错误。

  

无法找到'SpeechRecognizerDelegate'的协议声明;没有   你的意思是'SFSpeechRecognizerDelegate'?

任何人都可以指导我如何在我的Obj-C课程中使用swift类协议。

这是我的Swift代码:

import { Component } from '@angular/core';
import { EmployeesService } from './employees.service';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent {

    constructor(private employeesService: EmployeesService){}

    ngOnInit() {
        this.employeesService.getEmployees();
    }

}

在Obj-C中使用协议:

protocol SpeechRecognizerDelegate : class  {
    func speechRecognitionFinished(_ transcription:String)
    func speechRecognitionError(_ error:Error)
}


class SpeechRecognizer: NSObject, SFSpeechRecognizerDelegate {
    open weak var delegate: SpeechRecognizerDelegate?

}

如果需要更多信息,请告诉我。

先谢谢。

5 个答案:

答案 0 :(得分:4)

像这样定义你的 Swift 协议

@objc protocol SpeechRecognizerDelegate{
  func speechRecognitionFinished(_ transcription:String)
  func speechRecognitionError(_ error:Error)
}

对于协议使用,我们需要在 Objective C 文件中添加协议 -

#import "ARBot-Swift.h"

@interface ChatScreenViewController : JSQMessagesViewController <SpeechRecognizerDelegate>

然后您需要符合协议方法 -

- (void)viewDidLoad {
    [super viewDidLoad];
    SpeechRecognizer * speechRecognizer = [[SpeechRecognizer alloc] init];
    speechRecognizer.delegate = self;
}


#pragma mark - Delegate Methods
-(void)speechRecognitionFinished:(NSString *) transcription{
   //Do something here
}

-(void)speechRecognitionError:(NSError *) error{
   //Do something here
}

答案 1 :(得分:2)

为您的协议添加@objc属性:

@objc protocol SpeechRecognizerDelegate : class  {
    //...
}

答案 2 :(得分:1)

我在遵循(导入标题+协议上的Objc注释)之后遇到了类似的问题。当我从Objective C头文件中使用Swift代码时,我收到了警告。仅通过导入到实现.m文件解决。

答案 3 :(得分:1)

在Swift中:

@objc public protocol YOURSwiftDelegate {
    func viewReceiptPhoto()
    func amountPicked(selected: Int)
}

class YourClass: NSObject {
    weak var delegat: YOURSwiftDelegate?
}

在Objective-C headerFile.h中

@protocol YOURSwiftDelegate;

@interface YOURController : UIViewController < YOURSwiftDelegate >

在Objective-C实施中。m

SwiftObject * swiftObject = [SwiftObject alloc] init];
swiftObject.delegate = self

答案 4 :(得分:0)

使用前向声明在 Objective-C 标头中包含 Swift 类

//MySwiftClass.swift
@objc protocol MySwiftProtocol {}
@objcMembers class MySwiftClass {}

// MyObjcClass.h
@class MySwiftClass;
@protocol MySwiftProtocol;

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end