给定:
class Elem {
func f() -> AnotherElem {
return AnotherElem(elem: self)
}
}
我想在传递函数 f 的数组上调用 map 函数Elem
:
示例代码:
collection.map { $0.f() }
但是,我不喜欢这种{}
符号,所以我在考虑是否可以将函数作为参数传递(在我看来这增加了可读性(,而且确实可以 我想要做的是执行以下操作:
collection.map(Elem.f)
最后一个是有效的语法,但数组的类型如下:[() -> AnotherElem]
而不是预期的[AnotherElem]
类型。
是错误还是功能?
显然,这可以通过再次调用map
并调用块数组来解决,但这不是我遇到的问题。
我正在努力理解为什么会这样
这是预期的行为,即不是错误。
如果您尝试使用表单someMethod
实例方法,(T) -> U
直接像这样:
SomeType.someMethod
该表达式的类型为(SomeType) -> (T) -> U
。在您的情况下,Elem.f
的类型是(Elem) -> () -> AnotherElem
.
为什么这样设计?这样就可以将实例传递给SomeType.someMethod
,然后获取原始实例方法:
let f = SomeType.someMethod(instanceOfSomeType)
我想这可以被称为"咖喱"。
无论如何,您需要另一个函数来转换Elem.f
:
func uncurry<T, U>(_ f: @escaping (T) -> () -> U) -> (T) -> U {
return { f($0)() }
}
现在传递uncurry(Elem.f)
将起作用。