链式泛型类型在swift中推断出了闭包

时间:2018-04-16 05:41:20

标签: swift generics protocols

我正在努力在脑海中概念化如何创建一个通用接口或类的功能  像这样。

 functionOne {
    return "123"
 }
 .chainedFunction { string -> Int in
    return Int(string) + 456
 }
 .anotherChain {
    [NSNumber($0), String($0)]
 }
 .lastInTheChain {
     print("value 1: \($0[0])")
     print("value 2: \($0[1])")
 }

所以为了使它工作,它本质上是一个函数数组,它将返回值传递给  下一个函数的参数列表。

假设每个函数闭包都是在它来自的函数之后命名的  即

 functionOne(_ functionOne:(T) -> T) {}
 chainedFunction(_ chainedFunction:(T) -> T) {}

然后你会这样打电话给他们,以确保你传递正确的值。

lastInTheChain(anotherChain(chainedFunction(functionOne())))

我最擅长的部分是泛型部分以及类型推断是否有效  (这是次要问题,只要它有效就会很好)

我也试图使用协议,swift中的通用协议需要在这里和那里使用thunk,这只会让我感到困惑。

所以,如果你不介意我如何做到这一点,或者首先是否可行,我会非常感激,那么任何人都会有更多的知识。

1 个答案:

答案 0 :(得分:2)

functionOne需要返回具有chainedFunction实例方法的内容,该方法本身需要返回具有anotherChain实例方法的内容,依此类推。为此,您需要创建一个类型。我称之为包装因为我不知道你的用例,但是你应该把它命名为更有意义的东西。

import Foundation

struct Wrapper<T> {
    let value: T

    // This replaces `function1`
    init(_ value: T) { self.value = value }

    func chainedFunction<R>(_ transform: (T) -> R) -> Wrapper<R> {
        return Wrapper<R>(transform(self.value))
    }

    func anotherChain<R>(_ transform: (T) -> R) -> Wrapper<R> {
        return Wrapper<R>(transform(self.value))
    }

    func lastInTheChain<R>(_ transform: (T) -> R) -> R {
        return transform(self.value)
    }
}

 Wrapper("123")
 .chainedFunction { string -> Int in
    return Int(string)! + 456
 }
 .anotherChain {
    [NSNumber(value: $0), String($0)]
 }
 .lastInTheChain {
     print("value 1: \($0[0])")
     print("value 2: \($0[1])")
 }

术语:此Wrapper类型称为functor,因为它定义了map方法(此处称为chainedFunctionanotherChain,它们是等效函数在示例中)。使用map,可以使用可用于将T转换为R(转换)的闭包将Wrapper<T>转换为Wrapper<R>