Mutating a model Struct in closure
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
add a comment |
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
add a comment |
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
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
swift struct model closures google-cloud-firestore
asked Nov 15 '18 at 19:16
connorvoconnorvo
10510
10510
add a comment |
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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