小编Mar*_*tin的帖子

通用类型的Swift条件一致性

我正在尝试使用两种通用类型来开发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

8
推荐指数
1
解决办法
151
查看次数

标签 统计

swift ×1