我正在尝试使用两种通用类型来使用 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>>
to 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”子句指定
你有什么线索给我吗?有可能吗?
感谢您的帮助
Martin
对扩展的约束可以限制占位符类型E
具体类型或协议,例如:
extension Box where E: Item<Any> {}
extension Box where E == String {}
extension Box where E: Numeric {}
但你不能对扩展施加通用约束:
extension Box<A> where E: Item<A> {}
// Error: Constrained extension must be declared on the unspecialized generic
// type 'Box' with constraints specified by a 'where' clause
解决方案是限制method反而:
extension Box {
func mapOnItem<A, B>(function: (A) -> B) -> Box<Item<B>> where E: Item<A> {
return Box<Item<B>>(val: Item(val: function(self.value.value)))
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)