首页 > 解决方案 > 从函数中传递常量 - 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
    }

有谁知道如何解决这个问题?

谢谢!

标签: iosswiftdispatch-queue

解决方案


您需要关闭...更多信息在这里。而不是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")`

推荐阅读