Swift错误‘Extra trailing closure passed in call’解析及代码问题求助
问题解析与解决
错误原因
你遇到的「Extra trailing closure passed in call」错误本质是:你给一个完全不接受闭包参数的函数,强行传了尾随闭包。
看你AuthViewModel里的fetchUser函数定义:
func fetchUser() { guard let uid = userSession?.uid else { return } COLLECTION_USERS.document(uid).getDocument { snapshot, _ in guard let user = try? snapshot?.data(as: User.self) else { return } self.currentUser = user } }
这个函数的参数列表是空的,没有定义任何闭包类型的参数,所以调用时根本不能加{ user in ... }这种尾随闭包。
另外还有个逻辑问题:你当前调用fetchUser是想获取每个帖子对应的uid的用户,但原fetchUser函数的作用是获取当前登录用户,和你的需求完全不匹配,这也是你误用闭包的根源。
解决方法
针对「根据帖子uid获取对应用户」的需求,正确的做法是新增一个带参数的用户获取函数,而不是修改原有的fetchUser:
步骤1:在AuthViewModel中新增根据uid获取用户的方法
// AuthViewModel里添加这个函数 func fetchUser(withUid uid: String, completion: @escaping (User?) -> Void) { COLLECTION_USERS.document(uid).getDocument { snapshot, error in if let error = error { print("获取用户失败:\(error.localizedDescription)") completion(nil) return } let user = try? snapshot?.data(as: User.self) completion(user) } }
步骤2:在FeedCellViewModel中正确调用
把原来错误的调用替换成新函数:
func fetchPosts() { service.fetchPosts { posts in self.posts = posts for i in 0 ..< posts.count { let uid = posts[i].uid // 调用新增的带uid参数的方法 self.authViewModel.fetchUser(withUid: uid) { user in self.posts[i].user = user } } } }
额外说明
如果你确实需要用闭包回调的方式获取当前登录用户,可以修改原fetchUser函数让它支持闭包,但这和你当前的需求无关:
// 修改原fetchUser支持闭包 func fetchUser(completion: @escaping (User?) -> Void) { guard let uid = userSession?.uid else { completion(nil) return } COLLECTION_USERS.document(uid).getDocument { snapshot, _ in let user = try? snapshot?.data(as: User.self) self.currentUser = user completion(user) } } // 调用方式 authViewModel.fetchUser { user in // 处理当前登录用户数据 }
内容的提问来源于stack exchange,提问作者amelia
相关产品推荐
相关产品推荐

