使用swift从xcode中的QuickType生成模型时出错
我正在使用Alamofire4.0,我从一个非常有用的工具QuickType生成我的模型,但是我得到了这个错误。在Alamofire的扩展中,我不明白会发生什么,因为所有这些类都返回QuickType控制台 这是我从quicktype和Alamofire扩展中得到的模型使用swift从xcode中的QuickType生成模型时出错,swift,xcode,alamofire,quicktype,Swift,Xcode,Alamofire,Quicktype,我正在使用Alamofire4.0,我从一个非常有用的工具QuickType生成我的模型,但是我得到了这个错误。在Alamofire的扩展中,我不明白会发生什么,因为所有这些类都返回QuickType控制台 这是我从quicktype和Alamofire扩展中得到的模型 import Foundation import Alamofire class LoginResponse: Codable { let user: JSONNull? let status: Int
import Foundation
import Alamofire
class LoginResponse: Codable {
let user: JSONNull?
let status: Int
let success: Bool
let message: String
init(user: JSONNull?, status: Int, success: Bool, message: String) {
self.user = user
self.status = status
self.success = success
self.message = message
}
}
// MARK: Encode/decode helpers
class JSONNull: Codable, Hashable {
public static func == (lhs: JSONNull, rhs: JSONNull) -> Bool {
return true
}
public var hashValue: Int {
return 0
}
public init() {}
public required init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if !container.decodeNil() {
throw DecodingError.typeMismatch(JSONNull.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for JSONNull"))
}
}
public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
try container.encodeNil()
}
}
fileprivate func newJSONDecoder() -> JSONDecoder {
let decoder = JSONDecoder()
if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
decoder.dateDecodingStrategy = .iso8601
}
return decoder
}
fileprivate func newJSONEncoder() -> JSONEncoder {
let encoder = JSONEncoder()
if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
encoder.dateEncodingStrategy = .iso8601
}
return encoder
}
// MARK: - Alamofire response handlers
extension DataRequest {
fileprivate func decodableResponseSerializer<T: Decodable>() -> DataResponseSerializer<T> {
return DataResponseSerializer { _, response, data, error in
guard error == nil else { return .failure(error!) }
guard let data = data else {
return .failure(AFError.responseSerializationFailed(reason: .inputDataNil))
}
return Result { try newJSONDecoder().decode(T.self, from: data) }
}
}
@discardableResult
fileprivate func responseDecodable<T: Decodable>(queue: DispatchQueue? = nil, completionHandler: @escaping (DataResponse<T>) -> Void) -> Self {
return response(queue: queue, responseSerializer: decodableResponseSerializer(), completionHandler: completionHandler)
}
@discardableResult
func responseLoginResponse(queue: DispatchQueue? = nil, completionHandler: @escaping (DataResponse<LoginResponse>) -> Void) -> Self {
return responseDecodable(queue: queue, completionHandler: completionHandler)
}
}
<代码>导入基础
进口阿拉莫菲尔
类登录响应:可编码{
让用户:JSONNull?
let状态:Int
让成功:布尔
让消息:字符串
init(用户:JSONNull?,状态:Int,成功:Bool,消息:String){
self.user=用户
self.status=状态
自我成功=成功
self.message=消息
}
}
//标记:编码/解码帮助程序
类JSONNull:Codable,Hashable{
publicstaticfunc==(lhs:JSONNull,rhs:JSONNull)->Bool{
返回真值
}
公共值:Int{
返回0
}
公共init(){}
公共必需的init(来自解码器:解码器)抛出{
let container=尝试解码器。singleValueContainer()
if!container.decodeNil(){
抛出DecodingError.typeMismatch(JSONNull.self,DecodingError.Context(codingPath:decoder.codingPath,debugDescription:“JSONNull的类型错误”))
}
}
公共函数编码(到编码器:编码器)抛出{
var container=encoder.singleValueContainer()
尝试container.encodeNil()
}
}
fileprivate func newJSONDecoder()->JSONDecoder{
let decoder=JSONDecoder()
如果可用(iOS 10.0、OSX 10.12、tvOS 10.0、watchOS 3.0、*){
decoder.dateDecodingStrategy=.iso8601
}
返回解码器
}
fileprivate func newJSONEncoder()->JSONEncoder{
let encoder=JSONEncoder()
如果可用(iOS 10.0、OSX 10.12、tvOS 10.0、watchOS 3.0、*){
编码器.dateEncodingStrategy=.iso8601
}
返回编码器
}
//MARK:-Alamofire响应处理程序
扩展数据请求{
fileprivate func decodableResponseSerializer()->DataResponseSerializer{
返回DataResponseSerializer{},响应,数据,中的错误
guard error==nil else{return.failure(error!)}
guard let data=其他数据{
return.failure(AFError.responseSerialization失败(原因:.inputDataNil))
}
返回结果{try newJSONDecoder().decode(T.self,from:data)}
}
}
@可丢弃结果
fileprivate func responseDecodable(队列:DispatchQueue?=nil,completionHandler:@escaping(DataResponse)->Void)->Self{
返回响应(队列:队列,响应序列化程序:decodableResponseSerializer(),completionHandler:completionHandler)
}
@可丢弃结果
func responseLoginResponse(队列:DispatchQueue?=nil,completionHandler:@escaping(DataResponse)->Void)->Self{
return responseDecodable(队列:queue,completionHandler:completionHandler)
}
}
错误在这行代码中fileprivate func decodableResponseSerializer()->DataResponseSerializer
:
fileprivate func decodableResponseSerializer()->DataResponseSerializer{
返回DataResponseSerializer{},响应,数据,中的错误
guard error==nil else{return.failure(error!)}
guard let data=其他数据{
return.failure(AFError.responseSerialization失败(原因:.inputDataNil))
}
返回结果{try newJSONDecoder().decode(T.self,from:data)}
}
}
这上面说
无法专门化非泛型类型“DataResponseSerializer”
您使用的是Swift 5吗?我使用的是xcode 10.1和Swift 4.2@DávidPásztort问题是QuickType生成的代码使用Swift 5的
结果
类型。不管怎么说,4.0已经发布三年了,你为什么要使用这么旧的Alamofire版本呢?我已经有了最新版本的xcode 10.2和swift 5,但现在我在相同方法的代码的另一部分中发现了一个错误@DávidPászor,在DataResponseSerializer中,我刚刚更新了我的问题。你有没有发现这个问题?
fileprivate func decodableResponseSerializer<T: Decodable>() -> DataResponseSerializer<T> {
return DataResponseSerializer { _, response, data, error in
guard error == nil else { return .failure(error!) }
guard let data = data else {
return .failure(AFError.responseSerializationFailed(reason: .inputDataNil))
}
return Result { try newJSONDecoder().decode(T.self, from: data) }
}
}