swift - 由于“内部”保护级别,“结果”无法访问
问题描述
我想使用 URLSession 为通用 API 请求创建自定义框架。所以我使用了这个链接。我将使用这个项目作为自定义框架。因此,为了使用它,我已经通过 . 更改了它的访问说明符。并且open
使用这个链接我已经将它导入到我的项目中。我已经完成了以下代码来调用发布请求
import iOSCoreFramework
func callBySpeedyNetworking2() {
let trylogin = login(username: "****", password: "***")
SpeedyNetworking.removeToken()
SpeedyNetworking.postUrl(url: URL(string: GlobalConstants.loginFullURL), model: trylogin) { (response) in
if !response.success {
// show a network error
print("network error ",response.error)
return
}
// successful
print("RESPONSE 1 ------------> ")
dump(response.result(model: ModelResponse.self))
dump(response.jsonResults(model: ModelResponse.self))
}
}
但它给了我一个关于“成功”、“错误”和以下几行的错误:
dump(response.result(model: ModelResponse.self))
dump(response.jsonResults(model: ModelResponse.self))
从各种链接中,我SpeedyResponse
通过以下方式在课堂上进行了更改
public class SpeedyResponse {
public var success : Bool!
public var statusCode = 0
public var error: Error?
public var data: Data?
public init (success : Bool, statusCode : Int,error : Error, data : Data){
self.success = success
self.statusCode = statusCode
self.error = error
self.data = data
}
public init(data: Data?, response: URLResponse?, error: Error?) {
self.error = error
self.data = data
if let httpResponse = response as? HTTPURLResponse {
statusCode = httpResponse.statusCode
}
success = statusCode == 200 && error == nil && data != nil ? true : false
}
public func jsonResults<T>(model: T.Type) -> T? {
if !success { return nil }
guard let responseData = data else { return nil }
do {
return try JSONSerialization.jsonObject(with: responseData) as? T
} catch {
return nil
}
}
public func result<T: Decodable>(model: T.Type) -> T? {
if !success { return nil }
guard let responseData = data else { return nil }
do {
return try JSONDecoder().decode(model, from: responseData)
} catch {
return nil
}
}
}
但它仍然没有修复。
解决方案
这里的根本问题在于您的struct
所有变量和方法都自动声明,其范围为internal
. 因此,当您创建这样的类型时:
public class Human {
let foo: String
let bar: String
}
您将无法同时访问两者foo
,bar
因为它们实际上被声明为:
public class Human {
internal let foo: String
internal let bar: String
}
要解决此问题,只需将访问修饰符添加到public
.
从这个意义上说,您的新模型应该如下所示
public class SpeedyResponse {
public var success: Bool!
public var statusCode = 0
public var error: Error?
public var data: Data?
public init(data: Data?, response: URLResponse?, error: Error?) {
self.error = error
self.data = data
if let httpResponse = response as? HTTPURLResponse {
statusCode = httpResponse.statusCode
}
success = statusCode == 200 && error == nil && data != nil ? true : false
}
public func jsonResults<T>(model: T.Type) -> T? {
if !success { return nil }
guard let responseData = data else { return nil }
do {
return try JSONSerialization.jsonObject(with: responseData) as? T
} catch {
return nil
}
}
public func result<T: Decodable>(model: T.Type) -> T? {
if !success { return nil }
guard let responseData = data else { return nil }
do {
return try JSONDecoder().decode(model, from: responseData)
} catch {
return nil
}
}
}
推荐阅读
- flutter - Flutter/Dart http get 请求响应不完整
- azure - 我们在数据流 Azure 中是否有合并功能
- excel - 如何格式化单元格以在每个单元格的末尾添加 %
- ruby-on-rails - 将哈希深度转换为平面路径数组
- angular - 如何在 UI AutoComplete 中使用表单控件 #1169
- javascript - 用长字符串索引 javascript 对象
- testing - 如何在 Cypress.io 中检查一个元素是否包含多个项目
- performance - 当 Non-Prod DB 大小相对非常小或与 Prod DB 大小不同时,如何在 Non-Prod 中进行性能测试?
- docker - RuntimeError:无法缓存函数'__jaccard':文件'/usr/local/lib/python3.7/site-packages/librosa/util/matching.py'没有可用的定位器
- iis - 在 IIS 上为服务器上托管的所有站点启用 CORS