Тут такая история... URLSession.shared.dataTask...resume() - асинхронный вызов, он выполняется после выхода из getInfoUser: (это еще мы не коснулись структур, что copy). Вам нужно сделать примерно так:
func getInfoUser (id_users: String, completion: @escaping (([String: String?])->())) {
а далее:
var userInfo: [String:String?] = [:]
userInfo["firstName"]= responseApi.user[0].first_name
userInfo["lastName"] = responseApi.user[0].last_name
comepletion(userInfo)
вызов:
getInfoUser(id_users: "", completion: {
~code here~
})
идея такая, писал без ide, так что примерно