'responseJSON(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:completionHandler:)' is deprecated: responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead.
responseJSON() 메서드는 Alamofire 5 이하 버전에서 사용이 되며, Alamofire 6에서는 responseJSON이 사용 중지 되었으며, responseDecodable()를 사용을 권장하고 있습니다.
1. API 통신 구현체 구성
💡 모든 API 통신 응답값을 받을때 result, result_code, result_message 형태로 응답 값을 받을 수 있도록 처리하였습니다. 단 result의 타입은 제너릭타입으로 구성하여 서버에서 전달해 주는 다양한 형태의 타입이 들어오도록 구성하였습니다.
//// AFDataResponse.swift//// Created by Lee on 2023/02/27.//import Foundation
/**
* API 응답 구현체 값
*/structAFDataResponse<T: Codable>: Codable{
// 응답 결과값let result: T?
// 응답 코드let result_code: Int?
// 응답 메시지let result_message: String?
enumCodingKeys: CodingKey{
case result_code, result_message, result
}
init(fromdecoder: Decoder)throws {
let values =try decoder.container(keyedBy: CodingKeys.self)
result_code = (try? values.decode(Int.self, forKey: .result_code)) ??nil
result_message = (try? values.decode(String.self, forKey: .result_message)) ??nil
result = (try? values.decode(T.self, forKey: .result)) ??nil
}
}
[ 더 알아보기 ] 💡 제너릭 타입 이란?
- Swift에서 타입 안정성을 보장하면서 유연성을 제공하는 기능입니다. 일반적으로 Swift에서 값을 다룰 때는 정적 타입 지정을 하는데, 이렇게 정적으로 타입을 지정하면 컴파일러가 타입 안정성을 보장해줍니다. 하지만, 실제 개발을 진행하다 보면 컴파일 시점에 타입을 지정하지 않고 런타임 시점에 타입을 결정해야 하는 경우가 생길 수 있습니다. 이런 경우에 제네릭 타입을 사용하면 런타임 시점에 타입을 결정할 수 있습니다.
2. result의 데이터 모델 구성
💡 result로 전달받을 데이터를 모델로 구성하였습니다. 해당 데이터 모델의 요소는 id, name으로 구성이 되었습니다.
//// RoomModel.swift//// Created by Lee on 2023/02/27.//import Foundation
structRoomModel : Codable{
let id: String?
let name: String?
enumCodingKeys: CodingKey{
case id, name
}
init(fromdecoder: Decoder)throws {
let values =try decoder.container(keyedBy: CodingKeys.self)
id = (try? values.decode(String.self, forKey: .id)) ??nil
name = (try? values.decode(String.self, forKey: .name)) ??nil
}
}
[ 더 알아보기 ]
💡 CodingKey 타입
- CodingKey는 Swift에서 Codable 프로토콜을 이용할 때, JSON 데이터와 Swift 객체를 매핑하기 위한 열거형입니다. 즉, JSON 데이터와 Swift 객체의 프로퍼티 이름이 서로 다른 경우, CodingKey를 이용하여 매핑을 수행할 수 있습니다. CodingKey를 구현하기 위해서는 열거형 내부에 JSON 데이터의 key와 Swift 객체의 프로퍼티 이름을 case로 정의해주어야 합니다.
3. API 호출 함수 구성
💡 AFDataResponse라는 구성한 구현체에 응답값을 RoomModel로 받는 구조로 구성하였습니다.
import Alamofire
/**
* 방 존재여부 채크 API 통신
*/funcapiSearchRoom() -> Void{
print("API로 호출을 하였습니다.")
let baseURL =APIConstants.baseURL;
// Alamofire 를 통한 API 통신AF.request(
baseURL +"/room/295556",
method: .get,
encoding: JSONEncoding.default)
.validate(statusCode: 200..<500)
.responseDecodable(of: AFDataResponse<RoomModel>.self) { response inswitch response.result {
// [CASE] API 통신에 성공한 경우case .success(let value):
print("성공하였습니다 :: \\(value)")
// [CASE] API 통신에 실패한 경우case .failure(let error):
print("실패하였습니다 :: \\(error)" )
}
}
}