swift - 结构内部的变异函数

标签 swift structure mutating-function

我使用的是 Swift 4,我有一个用默认值初始化的结构。 我在里面创建了一个函数,它应该读取 JSON 并根据它获取的内容更改这些默认值,但它似乎不起作用。

错误:闭包不能隐式捕获一个变异的 self 参数

代码:

struct Workspace: Decodable {
    var guid: String
    var name: String

private enum CodingKeys : String, CodingKey {
    case guid = "guid"
    case name = "name"
}

init(){
    self.guid = "blbl"
    self.name = "oops"
}

mutating func getUserWorkspace(base: String, completed: @escaping () -> ()){
    let url = URL(string: "some url")!
    var request = URLRequest(url: url)

    request.addValue("Basic \(base)", forHTTPHeaderField: "Authorization")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    URLSession.shared.dataTask(with: request){ (data, response, error) in
        if error == nil {
            do {
                let res: Workspace = try JSONDecoder().decode(Workspace.self, from: data!)
                self.guid = res.guid  //Error here
                self.name = res.name  //Error here
                DispatchQueue.main.async {
                    completed()
                }
            }catch {
                print ("JSON error")
            }
        }
    }.resume()
}

我把let改成var了,但是我想还是有不明白的地方..

最佳答案

//Try this one and let me know
struct Workspace: Decodable {
    static var shared = Workspace()
    var guid: String
    var name: String

    private enum CodingKeys : String, CodingKey {
        case guid = "guid"
        case name = "name"
    }

    init(){
        self.guid = "blbl"
        self.name = "oops"
    }

    mutating func getUserWorkspace(base: String, completed: @escaping () -> ()){
        let url = URL(string: "some url")!
        var request = URLRequest(url: url)

        request.addValue("Basic \(base)", forHTTPHeaderField: "Authorization")
        request.addValue("application/json", forHTTPHeaderField: "Accept")

        URLSession.shared.dataTask(with: request){ (data, response, error) in
            if error == nil {
                do {
                    let res: Workspace = try JSONDecoder().decode(Workspace.self, from: data!)
                    Workspace.shared.guid = res.guid  //Error here
                    Workspace.shared.name = res.name  //Error here
                    DispatchQueue.main.async {
                        completed()
                    }
                }catch {
                    print ("JSON error")
                }
            }
            }.resume()
    }
}

关于swift - 结构内部的变异函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50297188/

相关文章:

api - 构建和维护具有多个文件的 Golang 项目

c - 从结构内的链接列表导出数据

swift - 结构变异函数调用同一结构的另一个实例中的函数

Swift 变异函数作为一等值

xcode - Swift 中的数组和字典类型声明

ios - Xcode 6.0 Swift,出现错误 : can't evoke'! =' with an argument list

MySQL 多列与单列的速度/优化

ios - 如何使用变异函数设置类属性?

ios - 在 iOS 上的图像中查找非透明填充的 CGRect

swift - .trimmingCharacters 的替代方案,让 Coderbytes 接受我的解决方案