광어네 맛집
[Swift Conversting] Dictionaray -> Model 전환 이슈 본문
[Swift Conversting] Dictionaray -> Model 전환 이슈
Lautner Jacob 2022. 8. 22. 14:30Objective C 로 되어 있는 프로젝트는 Swift를 사용하기 위해서는
'PROJECTNAME-Bridging-Header.h' 을 통해서 상호호환 할 수 있습니다.
헤더 파일만 있다고 다 구현할 수 있는 건 아님!
예를 들어 Objective C 는 Swift 구조체를 사용할 수 없고,
Enum 열거형도 사용할 수 없습니다
그렇지만 데이터를 따로 보내거나 각 언어에서 로직을 만든 다음에 보내어 사용할 수는 있습니다!
전제:
지금 다루고 있는 프로젝트 기준으로 말씀드리면
Objective C의 경우 디코딩을 하여 모델화하여 사용하고자 번거로운 작업을 해야했어요
For 반복문을 통해서 NSDictionary에 담아준 뒤 사용ㅎ... 그리고 모델처럼 사용할 수 있었음
Swift는 Codable 프로토콜을 이용하여 쉽게 파싱할 수 있잖아요
저 귀찮은 작업을 없애고 모
서론이 길었지만 상황을 정리하자면
Objective C에서 ObjectiveC 네트워크 라이브러리를 통해 받은 Data는
NSDictionary를 통해서 받을 수 있는 상황이었고
프로젝트 기한이 촉박하여 Objective C 에서 받은 Dictionary 값을 Swift로 들고 와서 사용하자 판단했어요
( 새롭게 만들어도 되지만 내부 이슈랑 복잡하다 보니 시간이 필요했어요 )
받아올 때 타입이 정해져있지 않고
'[AnyHashable: Any]'로 넘어와서 타입 케스팅을 해준 뒤 Model로 만들어 주었습니다
private func convertDictionaryJSONSwift<T: Codable>(_ data: Any?, _ dataModel: T.Type, completion: @escaping (T) -> Void) {
guard let dataDictionary = data as? Dictionary<String, Any> else { return print("타입 캐스팅 실패") }
do {
let json = try JSONSerialization.data(withJSONObject: dataDictionary)
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let decoderData = try decoder.decode(dataModel, from: json)
completion(decoderData)
} catch let error {
print("디코딩 실패", error)
}
}
조금 비효율적이지만 임시로 만들어 쓰기 위해서 적은 거라 ㅜㅜ
무튼 개발은 기간 내에 완성!
나중에 따로 테스트 해보다 알게 된 사실인데 그냥 ObjectiveC에서 끌고 와서
Class로 선언된 채로 사용할 수 있었어요 ㅎㅎ...
근데 중요한 게 있거나 없거나 무조건 강제 옵셔널 해제가 된 채로 오더라구요
좀 이상하지만 이렇게 해서 처리해봤어요
// 예를 들어
if nil =! AppDelegate.instance() {
~~ 구현 ~~
}
기간만 많으면 차근차근 할텐데 정신없는 하루네요 ㅋㅋㅋㅋ
아무튼 오늘도 화이팅!
( 틀린 내용이 있다면 언제든지 피드백 감사합니다!! )
'Objective-C [레거시 뿌수기!] > Objective-C' 카테고리의 다른 글
[Objective C] Static Method & Overloading (1) | 2022.09.30 |
---|---|
[Swift Conversting] Enum 호환 (0) | 2022.08.29 |
[Swift Library] Obective C에서 Swift Library 사용하기 (0) | 2022.06.21 |
[Objective-C] Dictionary 다루기 (0) | 2022.04.25 |
[Objective C] self & _ 비교 (0) | 2022.04.22 |