Swift Generic Class, реализующий протокол Objective-C

Я намерен создать общий класс в Swift, который соответствует протоколу Objective-C:

Класс:

class BaseViewFactoryImpl<T> : NSObject, BaseView {
  func getNativeInstance() -> AnyObject {
    return String("fsd")
  }
}

Протокол BaseView:

@protocol BaseView < NSObject >

- (id)getNativeInstance;

@end

Компилятор говорит мне:

Type 'BaseViewFactoryImpl<T>' does not conform to protocol 'BaseView'

Если я удалю <T>, то ошибки не будет.

Что здесь не так? Как я могу получить правильную реализацию универсального класса?

Ответ 1

Если вы создаете новую общую модель представления, когда вы пытаетесь создать какой-либо подкласс общей модели представления, вам необходимо объявить подкласс как общий класс. Это немного раздражает.

Для лучшего способа вы можете использовать typealias, чтобы объявить тип экземпляра вместо использования общего:

protocol BaseView {
    typealias T
    func getNativeInstance() -> T!
}

class StringViewModel : BaseView {

    typealias T = String

    func getNativeInstance() -> String! {
        return T()
    }

}

Ответ 2

//BaseViewFactory.swift

class BaseViewFactoryImpl<T> : NSObject, BaseView {
    func getNativeInstance() -> AnyObject {
        return String("fsd")
    }

//BaseViewProtocol.h

@protocol BaseView <NSObject>

- (id)getNativeInstance;

@end

//BridgingHeader.h

#import "BaseClassProtocol.h"

Ваш код должен работать. Создал ли заголовок моста для импорта файла протокола obj-C?

Ответ 3

Это работает в Swift 5:

class BaseViewFactoryImpl<T> : NSObject, BaseView {
  func getNativeInstance() -> Any {
    return "fsd"
  }
}

Нет ошибки сборки :)