简体   繁体   English

escaping 闭包捕获 swift iOS 中的变异“自我”参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM