在没有参数的情况下将函数传递给函数(如 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)
即可。
鉴于:
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)
即可。