Я пытаюсь заставить работать расширение Swift с двумя универсальными типами.Я пытался сделать пример.
У нас есть ящик, где мы можем для разных типов.
class Box<E> {
var value: E
init(val: E) {
value = val
}
}
Теперь у нас есть специальный Itemtype, который снова может иметь разные типы
class Item<Type> {
var value: Type
init(val: Type) {
value = val
}
}
Так что теперь мы можем легко создать Box<Item<Int>>
.Но, возможно, мы хотим изменить его на Box<Item<String>>
. Поэтому мне бы хотелось, чтобы расширение было изменено с Box<Item<A>>
на Box<Item<B>>
. Что работает, так это следующее
extension Box where E: Item<Any> {
func mapOnItem(function: (Any) -> Any) -> Box<Item<Any>> {
return Box<Item<Any>>(val: Item(val: function(value.value)))
}
}
Но это не очень полезно, потому что у нас нет связи между возвращаемым значением функции и возвращаемым значением mapOnItem.
Итак, я попытался исправить, но у меня не получается.Мое понимание было бы представить здесь другую переменную общего характера.
extension Box<A> where E: Item<A> {
func mapOnItem<B>(function: (A) -> B) -> Box<Item<B>> {
return Box<Item<B>>(val: Item(val: function(value.value)))
}
}
Я получаю ошибку
Ограниченное расширение должно быть объявлено для неспециализированного универсального типа 'Box' с ограничениями, указанными в предложении 'where'
У вас есть какие-нибудь подсказки для меня?Это вообще возможно?
Спасибо за помощь
Мартин