title: SwiftUI: wait for Alamofire request to finish BEFORE executing the code below
body: <p>I'm using an Alamofire request in a function to retrieve an user from a database. Thing is, the function the request is used in is dependant on the request since I'm returning the result as an object of a User class.</p>
  
  <p>Currently, it's always returning the default nil value declared at the top of my function since the code below the request doesn't bother to wait for the request to finish. Basic print statements in the .success or .failure parts prove that (because it doesn't print anything).</p>
  
  <p>I just don't know how to solve it. I've been looking online for a while, and:</p>
  
  <ul>
  <li>either I encounter suggestions on forums on what classes to use without even bothering to explain how to use it</li>
  <li>or I get a video that explains an entirely different thing, like handling multiple requests</li>
  </ul>
  
  <p>Can I get any help from you guys? I'm just going to post the code here down below:</p>
  
  <p><strong>The User class:</strong></p>
  
  <pre><code>public class User
  {
  
  private var _name : String
  
  public var Naam : String
  {
      get {return self._name}
      set
      {
          /*
             Just a function from a static class which trims a string. It's not really relevant to my problem …
           */
          let name : String? = StringOps.trimString(string: newValue)
  
          if name == nil
          {
              fatalError()
          }
  
          self._name = newValue
      }
  }
  
  /*
   * And some fields and properties for:
   *  - firstname
   *  - username
   *  - password
   *  - email
   * They are basically equivalent to the one above
   */
  
  // And a constructor
  init(id : Int)
  {
      self._id = id
      self._name = ""
      self._firstname = ""
      self._username = ""
      self._email = ""
      self._password = ""
  }
  }
  </code></pre>
  
  <p><strong>The request inside my login func in my LoginViewController:</strong></p>
  
  <pre><code>public func login(username: String, password: String)
      -&gt; User?
  var user : User? = nil
  
  /* Some code that is trimming and checking the input.
     The username parameter gets put into a let parameter userName and the same goes for the password parameter. It's Ommitted here.
   */
  
  let parameters : Parameters = [
          "userName" : userName!,
          "passWord" : passWord!
      ]
  
  // _loginUrl is a private let String parameter
  Alamofire.request(_loginUrl, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil)
      .responseJSON
      {
          (response : DataResponse&lt;Any&gt;) in
           switch (response.result)
          {
              case .success(_):
                  let data: NSDictionary = (response.value as! NSArray)[0] as! NSDictionary
  
                  /* The part commented out isn't working anyways,
                     and before I started changing the return type of my
                     function (was a Bool at first),
                     it worked well enough without it */
                  /*
                  if response.result.value != nil
                  {
                      /* Convert the JSON to a User object */
                      let data = (response.value as! NSArray)[0] as! NSDictionary
                      user = User(id: data["id"] as! Int)
                      user!.Email = data["e_mail"] as! String
                      user!.Username = data["username"] as! String
                      user!.Name = data["name"] as! String
                      user!.Firstname = data["firstname"] as! String
                      user!.Password = data["password"] as! String
                  }
                  */
  
                  user = User(id: data["id"] as! Int)
                  user!.Email = data["e_mail"] as! String
                  user!.Username = data["username"] as! String
                  user!.Name = data["name"] as! String
                  user!.Firstname = data["firstname"] as! String
                  user!.Password = data["password"] as! String
              break
  
              case .failure(_):
                  print(response.result.error as Any)
  
                  // _error is also a private var member of LoginViewController
                  self._error = "Something's wrong with your login credentials!"
                  user = nil
              break
          }
      }
  
      return user
  }
  </code></pre>
  
  <p><strong>This function gets used in a private function in my LoginView:</strong></p>
  
  <pre><code>struct LoginView
      : View
  {
      // Some unimportant bits
  
      private func logIn()
      {
          // username and password are @State private vars which are bound to their corresponding Text()
          let user : User? = self.controller.login(username: self.username, wachtwoord: self.password)
          // other code
      }
  }
  </code></pre>