Невозможно назначить класс Objective-C, соответствующий протоколу, свойству с протоколом Swift.

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

Я имею:

@objc public protocol FooProtocol {
    func foobar()
}

Затем мой файл Objective-C:

#import <UIKit/UIKit.h>
#import "SwiftObjcProtocolTest-Bridging-Header.h"

@protocol FooProtocol
@end

@interface ObjClass1 : NSObject <FooProtocol>

-(void)foobar;

@end

и импл:

#import "ObjClass1.h"

@implementation ObjClass1

- (void)foobar {
    NSLog(@"foobar protocol function called");
}

@end

Но когда я даю Swift (делаю это в основном в делегате приложения) свойство делегата и пытаюсь присвоить ему объект Objective-C:

var delegate: FooProtocol?
....
delegate = objcInstance
delegate?.foobar()

это терпит неудачу с:

не может присвоить значение типа ObjClass1 типу FooProtocol?

Я пытался заставить его as! FooProtocol но это приводит к SIGABRT.

В чем здесь проблема?

1 ответ

Чтобы это заработало, я обнаружил, что:

  1. Обязательно импортируйте ваш код Swift в Objective-C ( см. Здесь). Импортируйте это в ObjClass1.m,
  2. Ваша предварительная декларация протокола FooProtocol должен выглядеть так:

    @protocol FooProtocol;
    

вместо:

    @protocol FooProtocol
    @end

Примечание: хотя это сработало для меня, вероятно, есть лучшее решение, так как я получаю предупреждение в ObjClass1.h поговорка Cannot find protocol definition for 'FooProtocol',

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