Swift扩展URLSession报错:无法调用非函数类型‘URLSession’
错误原因与解决方法
错误原因
在URLSession的实例方法中,self指代的是已经初始化完成的URLSession实例,而非URLSession类型本身。你原本在myClass里通过URLSession(configuration:config)调用的是类型构造器来创建新实例,但在扩展的实例方法里写self(configuration:config),相当于把当前实例对象当作构造器函数调用,违反语法规则,因此编译器抛出“Cannot call value of non-function type 'URLSession'”错误。
解决方法
根据需求,有两种正确实现方式:
方式一:静态方法,基于自定义配置创建新Session执行请求
如果方法需要通过传入的配置生成新URLSession实例发起请求,直接将扩展方法改为静态方法:
extension URLSession { static func doSomethingElse<T: Decodable>(url: URL, config: URLSessionConfiguration, type: T.Type) -> AnyPublisher<Int, any Error> { return URLSession(configuration: config).dataTaskPublisher(for: url) .tryMap { response in guard let valueResponse = response.response as? HTTPURLResponse else { return 000 } return valueResponse.statusCode } .mapError { $0 } .eraseToAnyPublisher() } } // 使用示例 let customConfig = URLSessionConfiguration.default customConfig.httpAdditionalHeaders = ["Authorization": "Bearer token"] URLSession.doSomethingElse(url: yourTargetURL, config: customConfig, type: YourModel.self)
方式二:实例方法,基于已有配置的Session执行请求
URLSession实例创建后,其配置无法修改。若想复用已有Session的配置,直接移除config参数,使用当前实例的dataTaskPublisher:
extension URLSession { func doSomethingElse<T: Decodable>(url: URL, type: T.Type) -> AnyPublisher<Int, any Error> { return self.dataTaskPublisher(for: url) .tryMap { response in guard let valueResponse = response.response as? HTTPURLResponse else { return 000 } return valueResponse.statusCode } .mapError { $0 } .eraseToAnyPublisher() } } // 使用示例:先创建带自定义配置的Session实例 let customConfig = URLSessionConfiguration.default customConfig.timeoutIntervalForRequest = 60 let customSession = URLSession(configuration: customConfig) // 调用实例方法 customSession.doSomethingElse(url: yourTargetURL, type: YourModel.self)
关键说明
URLSession的配置是实例初始化时绑定的,实例创建完成后无法修改配置。如果需要不同的网络配置行为,必须创建对应的URLSession实例。
内容的提问来源于stack exchange,提问作者user2924482
相关产品推荐
相关产品推荐

