gpt4 book ai didi

swift - 不能在不可变值 : 'self' is immutable 上使用可变成员

转载 作者:可可西里 更新时间:2023-11-01 00:55:07 25 4
gpt4 key购买 nike

我不明白为什么会出现此错误。 SomeController 是一个类,而不是一个结构,它不是不可变的。有解决办法吗?

class SomeController: APIFetchable {

let baseUrl = "https://jsonplaceholder.typicode.com"
let defaultSession = URLSession(configuration: .default)
var dataTask: URLSessionTask?

func fetchDataFromAPI(atPath path: String, _ callback: ()-> Void){
fetchDataAtPath(path) { data, error in /*Error on this line -> "Cannot use mutating member on immutable value: 'self' is immutable"*/

}
}

}


protocol APIFetchable {
var baseUrl: String {get}
var defaultSession: URLSession {get}
var dataTask: URLSessionTask? {get set}

mutating func fetchDataAtPath(_ path: String, _ callback: @escaping (Data?, Error?)-> Void)
}

extension APIFetchable {

mutating func fetchDataAtPath(_ path: String, _ callback: @escaping (Data?, Error?)-> Void){
dataTask?.cancel()

if var urlComponents = URLComponents(string: baseUrl) {
urlComponents.path = path

guard let url = urlComponents.url else {return}

dataTask = defaultSession.dataTask(with: url) { data, response, error in
defer {self.dataTask = nil}

if let error = error {
print("data task error \(error.localizedDescription)")
callback(nil, error)
} else if let data = data, let response = response as? HTTPURLResponse, response.statusCode == 200 {
callback(data, nil)
}
}
dataTask?.resume()
}
}


}

最佳答案

看起来您有 2 个选项可以解决此问题(根据 this page )。

  1. SomeController 上实现 fetchDataAtPath() 的非变异版本。
  2. APIFetchable 协议(protocol)标记为仅类:protocol APIFetchable: class { ... },并删除变异的使用(如@rmaddy 在评论中提到的OP)

关于swift - 不能在不可变值 : 'self' is immutable 上使用可变成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51623693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com