광어네 맛집

[Swift Conversting] Dictionaray -> Model 전환 이슈 본문

Objective-C [레거시 뿌수기!]/Objective-C

[Swift Conversting] Dictionaray -> Model 전환 이슈

Lautner Jacob 2022. 8. 22. 14:30
728x90
반응형

Objective 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() {
  ~~ 구현 ~~
}

 

 

기간만 많으면 차근차근 할텐데 정신없는 하루네요 ㅋㅋㅋㅋ

아무튼 오늘도 화이팅!

 

( 틀린 내용이 있다면 언제든지 피드백 감사합니다!! )

728x90
반응형