我正在努力在脑海中概念化如何创建一个通用接口或类的功能 像这样。
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,这只会让我感到困惑。
所以,如果你不介意我如何做到这一点,或者首先是否可行,我会非常感激,那么任何人都会有更多的知识。
答案 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
方法(此处称为chainedFunction
和anotherChain
,它们是等效函数在示例中)。使用map
,可以使用可用于将T
转换为R
(转换)的闭包将Wrapper<T>
转换为Wrapper<R>
。