我正在尝试使用两种通用类型来开发Swift扩展。我试图举一个例子。
我们有一个盒子,可以放不同类型的盒子。
class Box<E> {
var value: E
init(val: E) {
value = val
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们有一个特殊的Itemtype,它又可以具有不同的类型
class Item<Type> {
var value: Type
init(val: Type) {
value = val
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我们可以轻松创建一个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)))
}
}
Run Code Online (Sandbox Code Playgroud)
但这不是很有用,因为我们没有从函数返回值到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))) …Run Code Online (Sandbox Code Playgroud) swift ×1