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"
}
}
Нет ошибки сборки :)