我有一个泛型结构FutureValue<Element>
和Failable<Element>
,它们都实现了map
...
struct FutureValue<Element> {
func map<U>(_ t: (Element) -> U) -> FutureValue<U> …
}
struct Failable<Element> {
func map<U>(_ t: (Element) -> U) -> Failable<U> …
}
我想在FutureValue
上写一个扩展,当它的Element
是 anyFailable
时专门化它,这样我就可以实现一个类似map
的函数,该函数Map到FutureValue<Failable<Element>>
中包含的Element
上。
如何在Swift中做到这一点?
3条答案
按热度按时间ruyhziif1#
您只需要创建一个协议,捕获“任何Failable”并捕获您想要的算法片段。
并表示所有Failables都是AnyFailable。
您可能希望在协议上添加方法以提取所需数据或提供方法。
然后,创建您的扩展:
值得注意的是我是如何构建这个的。我首先基于
String
编写了一个更具体的表单(只是随机选择一个):我写了一段简单的代码:
从那里,我提取了我需要的部分到协议中。这往往会让你朝着正确的方向前进,一步一步。有时直接跳到最通用的形式是非常具有挑战性的。
xpcnnkqh2#
非常感谢Rob的super answer。
我最后采用的方法略有不同,所以我将其作为第二个答案添加进来。对于泛型的扩展被约束在某种元素上的情况,我觉得这种方法更简单。它也是一种容易引入的“模式”,可以很容易地放入类似的情况。
Rob的方法让我实现了
map
(如OP中所述),但当我想实现flatMap
时,我开始挣扎。切换到使用AsFailable
让我快速编写了flatMap
的简单实现。我认为
AsXXX
方法对于这样的情况更简单,其中协议 * 只是 * 需要充当约束。以下是
happyFlatMap
的外观:kcwpcxri3#
有一种方法可以在没有附加协议的情况下为扩展中的函数指定这样的条件: