Я пытаюсь получить код ниже работаю на детской площадке:SWIF общего типа наследование от другого универсального типа
public protocol SomeTypeProtocol {
associatedtype T
func convertTo<TNew:SomeTypeProtocol>()-> TNew
}
public class SomeClass<T>: SomeTypeProtocol{
var item:T
public init(item:T)
{
self.item = item
}
public func convertTo<TNew:SomeTypeProtocol where TNew.T : T>()-> TNew
{
return SomeClass<TNew.T>(item: item as! TNew.T)
}
}
В принципе, у меня есть протокол с ассоциированным типом Т, и класс, соответствующий этим протокол с родовым типом T, и мне нужно реализовать функцию convertTo, которая просто преобразует тип класса T в другой тип TNew.T, который должен быть подклассом из T. . У меня это реализовано на других языках, таких как C# и Java, поэтому я не знаю, почему я не могу заставить его работать в Swift. Я получаю следующие ошибки:
1) error: type 'TNew.T' constrained to non-protocol type 'T'
public func convertTo<TNew:SomeTypeProtocol where TNew.T : T>()-> TNew
2) error: cannot invoke initializer for type 'SomeClass<TNew.T>' with an argument list of type '(item: TNew.T)'
return SomeClass<TNew.T>(item: item as! TNew.T)
3) note: expected an argument list of type '(item: T)'
return SomeClass<TNew.T>(item: item as! TNew.T)
4)note: protocol requires nested type 'T'
associatedtype T
Спасибо!
Я не достаточно хорош с генериками, но у меня есть возможность ответить на ваш вопрос, но я хотел бы отметить, что быстрое соглашение о создании конвертеров заключается в создании расширений, которые определяют новый метод 'init', который принимает нужный ввод, который нужно преобразовать – Alexander
Вы говорите, что статический тип 'TNew.T' должен быть подклассом' T' ... динамические типы одинаковы? (Или динамический тип 'TNew.T' суперкласса' T'?) В противном случае вы не сможете сделать это преобразование. – Hamish