gpt4 book ai didi

swift - 将不带参数的函数自身传递给函数(如 map/filter 等)不会调用函数,而是包装为没有参数的 block

转载 作者:搜寻专家 更新时间:2023-11-01 06:10:49 25 4
gpt4 key购买 nike

给定:

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

我想在传递函数 f 的 Elem 数组上调用 map 函数:

示例代码:

collection.map { $0.f() }

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

collection.map(Elem.f)

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

是错误还是功能?

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

我很难理解为什么会这样

最佳答案

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

如果您尝试直接像这样使用(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($0)() }
}

现在传递 uncurry(Elem.f) 将起作用。

关于swift - 将不带参数的函数自身传递给函数(如 map/filter 等)不会调用函数,而是包装为没有参数的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57936477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com