将不带参数的函数传递给函数(如map/过滤器等)不会调用该函数,而是包装为没有参数的块



给定:

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)将起作用。

最新更新