Mutating a model Struct in closure










0















I have a user model that also handles saving info about that user to my database (Firestore). When a user updates their info, I need it to save to Firestore but I also need the model to update. I am not sure how to handle this and am currently getting a 'Closure cannot implicitly capture a mutating self parameter'.



Should I create a separate handler class, or how do I go about this?



Model:



struct User 
var displayName: String?
var lastLoggedInAt: Int?
var createdAt: Int?
private(set) var questionsLeft: Int?
var currency: Int?

var dictionary: [String: Any]

init(dictionary: [String: Any])
self.displayName = dictionary["displayName"] as? String
self.lastLoggedInAt = dictionary["lastLoggedInAt"] as? Int
self.createdAt = dictionary["createdAt"] as? Int
self.questionsLeft = dictionary["questionsLeft"] as? Int
self.currency = dictionary["currency"] as? Int

self.dictionary = dictionary


mutating func setQuestionsLeft(to num: Int)
questionsLeft = num
dictionary["questionsLeft"] = num



// MARK: Set Firestore User Data
extension User
mutating func set(data: Data, then handler: Handler = nil)
guard let uid = Auth.auth().currentUser?.uid else return

let firestore = Firestore.firestore()
let ref = firestore.collection("users").document(uid)

ref.setData(data, merge: true) (error) in
if let error = error
handler?(.failure(error))

// update current user struct
// get an error
let keys = data.keys
for key in keys
self.dictionary[key] = data[key]

self = User(dictionary: self.dictionary)
handler?(.success("Successfully Set User Data"))












share|improve this question


























    0















    I have a user model that also handles saving info about that user to my database (Firestore). When a user updates their info, I need it to save to Firestore but I also need the model to update. I am not sure how to handle this and am currently getting a 'Closure cannot implicitly capture a mutating self parameter'.



    Should I create a separate handler class, or how do I go about this?



    Model:



    struct User 
    var displayName: String?
    var lastLoggedInAt: Int?
    var createdAt: Int?
    private(set) var questionsLeft: Int?
    var currency: Int?

    var dictionary: [String: Any]

    init(dictionary: [String: Any])
    self.displayName = dictionary["displayName"] as? String
    self.lastLoggedInAt = dictionary["lastLoggedInAt"] as? Int
    self.createdAt = dictionary["createdAt"] as? Int
    self.questionsLeft = dictionary["questionsLeft"] as? Int
    self.currency = dictionary["currency"] as? Int

    self.dictionary = dictionary


    mutating func setQuestionsLeft(to num: Int)
    questionsLeft = num
    dictionary["questionsLeft"] = num



    // MARK: Set Firestore User Data
    extension User
    mutating func set(data: Data, then handler: Handler = nil)
    guard let uid = Auth.auth().currentUser?.uid else return

    let firestore = Firestore.firestore()
    let ref = firestore.collection("users").document(uid)

    ref.setData(data, merge: true) (error) in
    if let error = error
    handler?(.failure(error))

    // update current user struct
    // get an error
    let keys = data.keys
    for key in keys
    self.dictionary[key] = data[key]

    self = User(dictionary: self.dictionary)
    handler?(.success("Successfully Set User Data"))












    share|improve this question
























      0












      0








      0








      I have a user model that also handles saving info about that user to my database (Firestore). When a user updates their info, I need it to save to Firestore but I also need the model to update. I am not sure how to handle this and am currently getting a 'Closure cannot implicitly capture a mutating self parameter'.



      Should I create a separate handler class, or how do I go about this?



      Model:



      struct User 
      var displayName: String?
      var lastLoggedInAt: Int?
      var createdAt: Int?
      private(set) var questionsLeft: Int?
      var currency: Int?

      var dictionary: [String: Any]

      init(dictionary: [String: Any])
      self.displayName = dictionary["displayName"] as? String
      self.lastLoggedInAt = dictionary["lastLoggedInAt"] as? Int
      self.createdAt = dictionary["createdAt"] as? Int
      self.questionsLeft = dictionary["questionsLeft"] as? Int
      self.currency = dictionary["currency"] as? Int

      self.dictionary = dictionary


      mutating func setQuestionsLeft(to num: Int)
      questionsLeft = num
      dictionary["questionsLeft"] = num



      // MARK: Set Firestore User Data
      extension User
      mutating func set(data: Data, then handler: Handler = nil)
      guard let uid = Auth.auth().currentUser?.uid else return

      let firestore = Firestore.firestore()
      let ref = firestore.collection("users").document(uid)

      ref.setData(data, merge: true) (error) in
      if let error = error
      handler?(.failure(error))

      // update current user struct
      // get an error
      let keys = data.keys
      for key in keys
      self.dictionary[key] = data[key]

      self = User(dictionary: self.dictionary)
      handler?(.success("Successfully Set User Data"))












      share|improve this question














      I have a user model that also handles saving info about that user to my database (Firestore). When a user updates their info, I need it to save to Firestore but I also need the model to update. I am not sure how to handle this and am currently getting a 'Closure cannot implicitly capture a mutating self parameter'.



      Should I create a separate handler class, or how do I go about this?



      Model:



      struct User 
      var displayName: String?
      var lastLoggedInAt: Int?
      var createdAt: Int?
      private(set) var questionsLeft: Int?
      var currency: Int?

      var dictionary: [String: Any]

      init(dictionary: [String: Any])
      self.displayName = dictionary["displayName"] as? String
      self.lastLoggedInAt = dictionary["lastLoggedInAt"] as? Int
      self.createdAt = dictionary["createdAt"] as? Int
      self.questionsLeft = dictionary["questionsLeft"] as? Int
      self.currency = dictionary["currency"] as? Int

      self.dictionary = dictionary


      mutating func setQuestionsLeft(to num: Int)
      questionsLeft = num
      dictionary["questionsLeft"] = num



      // MARK: Set Firestore User Data
      extension User
      mutating func set(data: Data, then handler: Handler = nil)
      guard let uid = Auth.auth().currentUser?.uid else return

      let firestore = Firestore.firestore()
      let ref = firestore.collection("users").document(uid)

      ref.setData(data, merge: true) (error) in
      if let error = error
      handler?(.failure(error))

      // update current user struct
      // get an error
      let keys = data.keys
      for key in keys
      self.dictionary[key] = data[key]

      self = User(dictionary: self.dictionary)
      handler?(.success("Successfully Set User Data"))









      swift struct model closures google-cloud-firestore






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 15 '18 at 19:16









      connorvoconnorvo

      10510




      10510






















          0






          active

          oldest

          votes












          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326498%2fmutating-a-model-struct-in-closure%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326498%2fmutating-a-model-struct-in-closure%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          這個網誌中的熱門文章

          What does pagestruct do in Eviews?

          Dutch intervention in Lombok and Karangasem

          Channel Islands