[英]escaping closure captures mutating 'self' parameter in swift iOS
I spent lot of time to fix this issue with other solutions unable to make it work.我花了很多时间来解决这个问题,而其他解决方案无法使其正常工作。
public struct LoanDetails {
public var dueDate: String?
public init() {}
}
public func getLoanDetails(_ result: @escaping (_ loanDetails: LoanDetails?, _ error: Error?) -> Void) {
//This is an API call it returns data here mentioned to get current date.
var loanDetails = LoanDetails()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM d, yyyy"
loanDetails.dueDate = dateFormatter.string(from: Date())
result(loanDetails, nil)
}
When I'm calling this getLoanDetails function in viewModel it throws an error: escaping closure captures mutating 'self' parameter当我在 viewModel 中调用此 getLoanDetails function 时,它会引发错误: escaping 闭包捕获变异的“自我”参数
struct MyViewModel {
var var dueDate: String?
mutating func getLoanData() { //must be mutating to set some other properties
getLoanDetails({ (loanDetails, error) in
dueDate = loanDetails?.dueDate // Getting error here
})
}
}
Calling getLoanData() from viewDidload can anyone suggest correct way of doing this.从 viewDidload 调用 getLoanData() 任何人都可以提出正确的方法。
I know by changing viewModel struct to class and removing mutating keyword it works but I wanted to maintain all viewModels as struct in app.我知道通过将 viewModel 结构更改为 class 并删除 mutating 关键字它可以工作,但我想在应用程序中将所有 viewModel 维护为结构。
You can achieve with by changing MyViewModel
struct
to class
will solve your problem.您可以通过将MyViewModel
struct
更改为class
来解决您的问题。
class MyViewModel {
var dueDate: String?
func getLoanData() {
getLoanDetails { loanDetails, error in
self.dueDate = loanDetails?.dueDate
}
}
}
Just add self prefix before dueDate.只需在到期日期之前添加自我前缀。 It will be like this会是这样
struct MyViewModel {
var dueDate: String?
mutating func getLoanData() { //must be mutating to set some other
getLoanDetails({ (loanDetails, error) in
self.dueDate = loanDetails?.dueDate // Getting error here
})
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.