ios - 从函数中传递常量 - Swift
问题描述
我希望这听起来不会很愚蠢,但我想说:
let lowercasedQuery = query.lowercased()
let usersNew = users.filter({ $0.fullname.lowercased().contains(lowercasedQuery) || $0.username.contains(lowercasedQuery) })
进入 DispatchQueue 函数,但显然,由于它们是函数中声明的常量,因此该函数超出了返回行的范围。
func filteredUsers(_ query: String) -> [User] {
let delay = 3.3
DispatchQueue.main.asyncAfter(deadline: .now() + delay)
{
}
let lowercasedQuery = query.lowercased()
let usersNew = users.filter({ $0.fullname.lowercased().contains(lowercasedQuery) || $0.username.contains(lowercasedQuery) })
return usersNew
}
有谁知道如何解决这个问题?
谢谢!
解决方案
您需要关闭...更多信息在这里。而不是return
,调用完成处理程序闭包。
func filteredUsers(_ query: String, completion: @escaping (([User]) -> Void)) {
let delay = 3.3
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
let lowercasedQuery = query.lowercased()
let usersNew = self.users.filter({ $0.fullname.lowercased().contains(lowercasedQuery) || $0.username.contains(lowercasedQuery) })
completion(usersNew)
}
}
用法:
viewModel.filteredUsers(searchText) { users in
print(users) /// get your users here!
}
如果您试图users
在另一个函数中返回,它将不起作用。您还需要为该函数添加一个闭包:
/// another closure here
func mainFunction(_ query: String, completion: @escaping (([User]) -> Void)) {
viewModel.filteredUsers(query) { users in
completion(users) /// equivalent to `return users`
}
}
mainFunction("searchText") { users in
print(users) /// get your users here!
}
/// NOT `let users = mainFunction("searchText")`
推荐阅读
- visual-studio-code - 有没有办法通过 CodeAction 请求执行自定义操作?
- postgresql - 我想得到最大发行量的书。次
- android - 如何处理使用自定义 AutoML 模型后弹出的缓冲区溢出异常?
- c - 仅在发布时分配失败
- python - 关闭张量流消息
- python - 将烧瓶应用程序部署到 Elastic Beanstalk 时出错
- java - 没有单击按钮就不会传递 EditText 数据
- angular - 两个组件之间无法通信,侧边栏未更新
- java - 如何在 Java 应用程序中精细控制多个线程?
- angular - Firebase 异步数据检索需要时间