SwiftUI和完成处理程序有问题

SwiftUI和完成处理程序有问题,swiftui,completionhandler,Swiftui,Completionhandler,我试图让用户选择他们的用户名;如果在注册过程中尚未采取措施,他们可以继续进行,否则他们无法注册 我有以下资料: Button(action: { if (self.verifyUsername(username: self.username)) { withAnimation { self.isTaC.toggle()

我试图让用户选择他们的用户名;如果在注册过程中尚未采取措施,他们可以继续进行,否则他们无法注册

我有以下资料:

Button(action: {

    if (self.verifyUsername(username: self.username)) {
                        
        withAnimation {
                           
            self.isTaC.toggle()
                            
        }
                    
    }) {
                    
        Text("Save Profile and Agree")
                    
    }
其中包括:

func verifyUsername(username: String) -> Bool {
    
    userStore.usernameExists(username: username) { flag in
        
        if (flag) {
            
            return true
        
        } else {
        
            return false
        
        }
        
    }
    
}
最后是从Firebase获取信息的userstore:

func usernameExists(username: String, completion: @escaping (Bool) -> Void) {
    
    usernameRef.child(username).observeSingleEvent(of: .value, with: { (snapshot) in
        
        if (snapshot.exists()) {
            
            print("Username Exists")
            completion(true)
            
        } else {
            
            print("Username DOESN'T Exists")
            completion(false)
            
        }
        
    })
    
}
我的
userStore.usernameExists(username:username){标志出现在我的代码的
部分,我不明白为什么


有人能帮我解决这个问题吗?

您的验证是异步的,因此您应该使用回调而不是返回值

所以它应该如下所示

Button("Save Profile and Agree") {

    self.verifyUsername(username: self.username)) {
        withAnimation {
            self.isTaC.toggle()
        }
    }                    

}

// ...

func verifyUsername(username: String, processForCorrect: @escaping () -> ()) {
    userStore.usernameExists(username: username) { flag in
        if (flag) {
          DispatchQueue.main.async {
            processForCorrect()
          }
        }
    }
}

verifyUsername
应该返回一个
Bool
,但它不返回。它只调用
userStore.usernameExists
,并且由于它是唯一的语句,因此有一个隐含的
返回值
userStore.usernameExists
是,这是……
Void
,或
()
Thx再次出现…它正在工作,我想我唯一的另一个问题是如何让它抛出一个错误来通知用户已使用的用户名,这就是为什么我让func最初返回true/false,以便我可以将错误消息抛出给用户?