【发布时间】:2017-07-30 18:32:13
【问题描述】:
我试图在后台保存一个结构,但我收到了这个错误:
闭包不能隐式捕获变异的 self 参数
这是我的代码:
//MARK: Parse self methods
fileprivate mutating func ParseSave(_ completionBlock: @escaping SuccessCompletionBlock) {
let message: PFObject = PFObject(className: "Message")
if let id = self.id {
//this object exit just update it
message.objectId = id
}
// set attributes
if let text = self.text {
message["text"] = text
}
message["sender"] = PFUser(withoutDataWithObjectId: self.sender.id)
message["conversation"] = PFObject(withoutDataWithClassName: "Conversation", objectId: conversationId)
message["viewed"] = self.viewed
message.saveInBackground { (success, error) in
if success {
// the next 3 lines cause the error : (when I try to update the struct - self )
self.id = message.objectId
self.createdAt = message.createdAt ?? self.createdAt
self.updatedAt = message.updatedAt ?? self.updatedAt
}
completionBlock(success, error)
}
}
【问题讨论】:
-
哪一行生成错误信息? (
ibutes到底是什么?) -
在完成处理程序中对结构进行变异是没有意义的。完成处理程序将处理块捕获的结构副本,因此块内所做的任何更改都不会反映在调用者中。
-
见stackoverflow.com/a/41941810/1271826。或者在 Stack Overflow 中搜索“闭包不能隐式捕获变异的 self 参数”(在消息周围使用引号搜索)。以前有人问过并回答过。
-
@dan 即使我使用
myMessage.ParseSave() { success, error in }myMessage 也会被完成块内的副本捕获?? -
所以
self是一个结构?你明白,不是吗,结构突变并不真正存在?它实际上涉及复制和替换。因此,您将尝试在延迟后将self替换为另一个对象。这似乎不连贯。
标签: swift cocoa-touch