函数没有输出值

问题描述 投票:0回答:1

我无法从函数中获取 3 个值,我收到一条错误消息:

无法将类型“(String, String, String)”的值转换为闭包结果类型“Void”

这是代码:

func readDataUser() -> (uid: String, plan: String, role: String) {
        
        let ref = Database.database().reference()

        let userUid = AuthManager.shared.retrieveUid

        let nodeUser = ref.child(RefDatabase.users.rawValue).child(userUid())

        nodeUser.observeSingleEvent(of: .value) { snapshot in
            
            let uid = snapshot.childSnapshot(forPath: "uid").value as? String ?? "no name"
            let plan = snapshot.childSnapshot(forPath: "plan").value as? String ?? "no name"
            let role = snapshot.childSnapshot(forPath: "role").value as? String ?? "no name"
            
            return (uid, plan, role)
// Cannot convert value of type '(String, String, String)' to closure result type 'Void'
            
        }

// if return (uid, plan, role) i put here it doesn't give the error, but it doesn't print the values, they are empty
        
    }

我希望您为我打印这些值:

let dataUser = RealtimeManager.shared.readDataUser()
        print("User data is: \(dataUser.uid) - \(dataUser.plan) - \(dataUser.role)")
swift firebase
1个回答
0
投票

正如@vadian 所说,这是一项

async
任务。因此,你不能把它当作正常的
sync
。我更喜欢新的 API
async
而不是
completion

首先,你需要将

observeSingleEvent
补全包裹在
withUnsafeContinuation
中:

func readDataUser() async -> (uid: String, plan: String, role: String) {
    ...
    return await withUnsafeContinuation { continuation in
        nodeUser.observeSingleEvent(of: .value) { snapshot in
            let uid = snapshot.childSnapshot(forPath: "uid").value as? String ?? "no name"
            let plan = snapshot.childSnapshot(forPath: "plan").value as? String ?? "no name"
            let role = snapshot.childSnapshot(forPath: "role").value as? String ?? "no name"
            continuation.resume(returning: (uid, plan, role))
        }
    }
}

然后获取

Task
内的值:

Task {
    let dataUser = await self.readDataUser()
    print("User data is: \(dataUser.uid) - \(dataUser.plan) - \(dataUser.role)")
}
© www.soinside.com 2019 - 2024. All rights reserved.