Как использовать реализацию протокола swift в Objective-C?

#swift #objective-c

Вопрос:

Я новичок в iOS. У меня есть библиотека, которую я использую в своем приложении как в файлах Swift, так и в файлах Objc (я правильно подключил свою библиотеку, включая файл *-Swift.h).

Итак, моя библиотека имеет такую структуру

Фабрика

 import Foundation

@objc public class Factory : NSObject{
    @objc public func create() -> ModelProtocol
    {
        return FirstModel()
    }
}
 

Типовой протокол

 import Foundation

@objc public protocol ModelProtocol
{
    func foo()
}
 

Первая Модель

 import Foundation

public class FirstModel : NSObject, ModelProtocol
{
    public func foo() {
        //Do some things here
    }
}
 

когда я пытаюсь использовать эту фабрику на стороне Swift, все работает правильно

 import Foundation
import Lib

class TestClass {
    
    public init(){}
    
    func boo()
    {
        let factory = Factory()
        let _: ModelProtocol = factory.create()
    }
}
 

но когда я пытаюсь сделать то же самое на стороне Objc, я получаю ошибку

 Use of undeclared identifier 'ModelProtocol'
 
 #import <Foundation/Foundation.h>
#import "Lib-Swift.h"


@implementation ViewController : NSObject

- (void)foo {
    Factory *factory = [Factory new];
    ModelProtocol *protocol = [factory create];
}

@end
 

кроме того, я поместил оба этих проекта (библиотеку и приложение) на свой диск https://drive.google.com/drive/folders/1-DMYMhTqTqpgHcp31DNVby7US46OXUYM?usp=sharing

Как это исправить?

Ответ №1:

На самом деле ваша единственная проблема-неправильный синтаксис протоколов в Objective-C. Правильно, тип, соответствующий протоколу, будет написан таким образом:

 id<ModelProtocol> protocol = [factory create];