在没有参数的情况下将函数传递给函数(如 map/filter 等)不会调用函数,而是包装为没有参数的块

Passing function on self without parameters to the function (like map/filter etc.) doesn't call the function but wraps as a block without args

鉴于:

class Elem {
    func f() -> AnotherElem {
        return AnotherElem(elem: self)
    } 
}

我想在传递函数 f:

Elem 数组上调用 map 函数

示例代码:

collection.map { [=12=].f() }

但是,我不喜欢这种 {} 表示法,所以我在考虑是否可以将函数作为参数传递(在我看来这增加了可读性),事实上我可以 我想要的是执行以下操作:

collection.map(Elem.f)

最后一个语法是有效的,但是数组的类型如下:[() -> AnotherElem] 而不是预期的 [AnotherElem] 类型。

是错误还是功能?

显然,这可以通过再次调用 map 并调用块数组来解决,但这不是我遇到的问题。

我很难理解为什么会这样

这是预期的行为,即不是错误。

如果您尝试像这样直接使用形式(T) -> U的实例方法someMethod

SomeType.someMethod

该表达式的类型是 (SomeType) -> (T) -> U。在你的例子中, Elem.f 的类型是 (Elem) -> () -> AnotherElem.

为什么要这样设计?就是这样可以传一个实例给SomeType.someMethod,然后得到原来的实例方法:

let f = SomeType.someMethod(instanceOfSomeType)

我想这有点像 "currying"。

无论如何,你需要另一个函数来转换 Elem.f:

func uncurry<T, U>(_ f: @escaping (T) -> () -> U) -> (T) -> U {
    return { f([=12=])() }
}

现在传递 uncurry(Elem.f) 即可。