기어가더라도 제대로

[SwiftUI-기초] 계층적인 Codable 데이터 다루기 본문

SwiftUI - 기초

[SwiftUI-기초] 계층적인 Codable 데이터 다루기

Damagucci-juice 2022. 11. 10. 23:10
  • Codable encoding(), decoding() 은 이전 포스팅을 참조해주세요.

2022.11.06 - [SwiftUI - 기초] - [SwiftUI-기초] Codable (with UserDefaults)

 

  • 이번에는 User 라는 구조체가 또다른 구조체를 프로퍼티에 들고 있는 것도 Encoding, Decoding을 해볼 것입니다. 
  • 이런식으로 가면은 아래로 많은 단계의 계층구조도 작업이 가능합니다. 
Button("Decode JSON") {
    let input = """
    {
        "name": "Taylor Swift",
        "address": {
            "street": "555, Taylor Swift Avenue",
            "city": "Nashville"
        }
    }
    """


}
  • 버튼을 누르면 이런 코드가 되는데요. JSON 타입의 이 스트링을 저희가 사용할 수 있는 인스턴스로 바꿔보는 작업입니다. 
  • 이것을 위한 타입을 선언해주겠습니다.
struct User: Codable {
    let name: String
    let address: Address
}

struct Address: Codable {
    let street: String
    let city: String
}
  • input string 을 위의 타입의 인스턴스로 바꾸는 작업이에요 !
  • 위의 코드는 다른 파일에 있어도 되고, ContentView 안에 있어도되는데 저는 빼주었습니다. 
  • 이렇게 하고요.. 위에 버튼의 action 나머지 부분에 다음과 같은 코드를 추가해주면..
let data = Data(input.utf8)
let decoder = JSONDecoder()
if let user = try? decoder.decode(User.self, from: data) {
    print(user.address.street)
}
  • JSON 형식으로된 Text 를 Data 로 바꿉니다.(Binary 타입으로 변환)
  • Decoding(바이너리 데이터를 인스턴스화, 복호화) 을 위해 JSONDecoder() 를 생성합니다. 
  • decode 작업은 오류를 반환할 수 있으니, try? 를 앞에 달아준 모습입니다. 

  • 테일러 스위프트의 주소를 잘 뽑아낸걸 보니 디코딩이 성공했나보네요! 
  • encoding 은 위의 참조 주소에 나와있습니다. 
Comments