假设我们有以下方法:
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)
}
}