如何将函数传递给另一个设置其完成闭包的函数?



假设我们有以下方法:

func searchLocation(keyword: String, completion: @escaping RequestResult<[Location])>)

其中RequestResult是要public typealias RequestResult<T> = (Result<T>) -> ()的类型别名

还有另一种方法:

func throttleRequest<T>(request: PLACEHOLDER, completion: @escaping RequestResult<[T]> {
request { result in 
print("Capturing some data") // do some stuff with the result in this scope
completion(result)           // tell the caller the network function finsihed with `result`
}
}

我应该如何修改方法签名,以便我可以执行以下操作:

throttleRequest(request: {
searchLocation(keyword: "New York", completion: PLACEHOLDER)
}, 
completion: { result in
if case .success(let found) = result {
print("location found")
}
})

以便打印以下内容:

$ Location found
$ Capturing some data

我已经在某些类型定义上输入了上面的占位符,因为我无法真正弄清楚什么是合适的。

首先,让我们使用正确的返回类型而不是与Void相同的()。当您明确指定返回 void 而不是写入()时,它更容易阅读。无论如何,你想要的是一个 lambda 函数参数。

IE:你想要一个将lambda作为参数的函数。 因此:

public typealias RequestResult<T> = (Result<T, Error>) -> Void
func searchLocation(keyword: String, completion: RequestResult<[Location]>) {
completion(.success([Location()]))
}
func throttleRequest<T>(request: (RequestResult<[T]>) -> Void, completion: @escaping RequestResult<[T]>) {
request {
print("Capturing some data")
completion($0)
}
}

因此,函数/lambda 作为参数的语法是:(ArgumentType...) -> ReturnType

  • (Int) -> Void是一个接受 int 的函数,返回 Void/nothing。
  • (T) -> U是一个接受 T 参数并返回 U 的函数。

同样,如果您希望参数是可选的,则将其定义为:

((Arguments...) -> ReturnType)?

用法:

throttleRequest(request: { result in
self.searchLocation(keyword: "New York", completion: result)
}, completion: { result in
switch result {
case .success(let locations):
print(locations)
case .failure(let error):
print(error)
}
})

或者更容易阅读(imo你_ request参数

(:
throttleRequest({ self.searchLocation(keyword: "New York", completion: $0) }) {
switch $0 {
case .success(let locations):
print(locations)
case .failure(let error):
print(error)
}
}

最新更新