代码之家  ›  专栏  ›  技术社区  ›  Genhain

swift中链式泛型类型推断闭包

  •  0
  • Genhain  · 技术社区  · 7 年前

    我正在努力在脑海中构思如何创建一个通用接口或类,该接口或类的功能 就像这样。

     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])")
     }
    

    因此,为了实现这一点,它本质上是一个函数数组,通过管道将其返回值传递到 下一个函数的参数列表。

    假设每个函数闭包都是以它来自的函数命名的 i、 e类

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

    然后像这样调用它们,以确保传递正确的值。

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

    我最纠结的部分是泛型部分,以及类型推理是否有效 (这是第二个问题,如果能奏效就好了)

    我也在尝试使用协议,swift中的通用协议需要到处使用thunks,这只会加剧我的困惑。

    因此,如果你不介意插一句我是如何做到这一点的,或者这一点是否可行,我将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Alexander    7 年前

    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 类型称为a functor ,因为它定义了 map 方法(此处调用 链式函数 另一条链 ,在示例中是等效函数)。使用 地图 ,一个可用于转换的闭包 T R (transform)可用于转换 Wrapper<T> 变成一个 Wrapper<R>