Невозможно назначить класс 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 ответ
Чтобы это заработало, я обнаружил, что:
- Обязательно импортируйте ваш код Swift в Objective-C ( см. Здесь). Импортируйте это в
ObjClass1.m
, Ваша предварительная декларация протокола
FooProtocol
должен выглядеть так:@protocol FooProtocol;
вместо:
@protocol FooProtocol
@end
Примечание: хотя это сработало для меня, вероятно, есть лучшее решение, так как я получаю предупреждение в ObjClass1.h
поговорка Cannot find protocol definition for 'FooProtocol'
,