【问题标题】:Swift ui Escaping closure captures mutating 'self' parameterSwift ui 转义闭包捕获变异的“自我”参数
【发布时间】:2021-07-14 21:32:14
【问题描述】:

我在init()使用时遇到以下问题,谁能帮帮我?

    @State private var activity: [ResponseActivity] = [ResponseActivity()]

    func getActivity(completion: @escaping ([ResponseActivity]?) -> ()){
        var userInfo: [ResponseActivity] = [ResponseActivity()]
        let url = URL(string: "https://api.github.com/users/\(self.userInfo.login)/received_events")!
        let urlRequest = URLRequest(url: url)
        
        print("self.userInfo.login", self.userInfo.login)
        
        let task = URLSession.shared.dataTask(with: urlRequest) { data, urlResponse, error in
            guard let content = data else {
                print("Error getting data from API.")
                return
            }
            
            do {
                userInfo = try JSONDecoder().decode([ResponseActivity].self, from: content)
            } catch {
                print("Error parsing URL from data Activity.")
                return
            }
            completion(userInfo)
        }
        task.resume()
    }

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    像这样的struct (View) 中的属性是不可变的。您可以在init 中设置初始值,但之后它们就不再可变了。像 @State 这样的特殊属性包装器允许您稍后更改值,但您正尝试使用 _activity = State(...)struct 上设置实际值。

    我建议将这样的异步代码移至ObservableObject——然后,您将拥有一个具有可变属性的class。这意味着您的userInfoisLogin 等将是@Published 属性,并且可能需要是可选的,因为它们在getActivity 完成之前没有值。

    【讨论】:

    • 如果我发布代码,我可以请你告诉我你会怎么做吗?
    • 我已经解释了如何做到这一点 - 您可以将您的尝试发布为对问题的编辑,以便我知道您遇到问题的地方吗?
    • 我按照您的指示尝试了,我编辑了帖子,但我遇到了问题。我能问你我哪里错了吗?
    • 我回答了你最初的问题——你现在遇到的是完全不同的问题,不属于原始问题的范围(严格意义上的自我变异)。一般来说,关于 SO,礼仪是在这种情况下提出一个新问题。当我要求您进行编辑时,我认为您对我的建议有疑问,这超出了。我看到的主要问题是您没有在菜单和页脚之间使用相同的 StateApp 实例。你知道怎么解决吗?
    • 我会修改这个并打开一个新问题。
    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    相关资源
    最近更新 更多