Невозможно назначить класс 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.

В чем проблема?


person Alex Bollbach    schedule 28.05.2017    source источник
comment
Что, если полностью удалить определение протокола в заголовочном файле?   -  person Amin Negm-Awad    schedule 28.05.2017


Ответы (1)


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

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

    @protocol FooProtocol;
    

вместо:

    @protocol FooProtocol
    @end

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

person paulvs    schedule 28.05.2017
comment
я получаю предупреждение, которое вы упомянули дважды (повторение предупреждения указывает мне, что Xcode не слишком падает с моей настройкой). Также. я получаю I_OBJC_PROTOCOL_$_FooProtocol, referenced from: и ничего. и linker command failed with exit code (-v for more..). и что странно, щелчок по этим ошибкам даже не приводит меня к дополнительной информации, указывающей на то, что здесь что-то не так или не настроено. - person Alex Bollbach; 28.05.2017