Open API 를 이용하여 JSON 데이터를 받아와 구조체 형성하고 변수 사용하기에 대한 질문입니다 제발 도와주세요 ㅠㅜ

태그: 

3 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 재우 유
      참가자
      • 글작성 : 1
      • 답글작성 : 1

      오픈 API를 이용하여 제가 좋아하는 축구팀의 정보를 가져와 테이블 구조에 정보를 출력하는 어플을 만들고 있었는데 일주일동안 막히는 부분이 있어서 질문드립니다. ㅠㅜ

      스크린샷 2022-03-04 오후 9.40.41

      우선 제가 사용하려는 JSON 데이터이고스크린샷 2022-03-04 오후 9.41.55

      이 코드를 사용하여 함수 API()를 호출하면 데이터를 받아오게끔 코드를 작성했습니다.

      스크린샷 2022-03-04 오후 9.43.18

      API() 함수를 호출했을 때에 콘솔창에 데이터가 출력 되는 것도 확인하였습니다.

      스크린샷 2022-03-04 오후 9.43.38스크린샷 2022-03-04 오후 9.55.16

      이런 식으로 struct를 구성했는데 계속 오류가 나서 인터넷을 계속 찾아봐도 해결이 되지않아 답답한 마음에 여쭤봅니다.
      CodingKey 프로토콜을 사용한 이유는 애플 측에서 카멜형식의 언어로 디코딩을 해야 오류가 안난다고 하여 사용하였습니다.

      아래 주소는 제가 어떤 앱을 만들고 있는지 만들면서 작성한 블로그 입니다.
      https://velog.io/@blooper20/series/IFP-%EA%B2%A8%EC%9A%B8%EB%B0%A9%ED%95%99-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8

    • rhrnakrnakr
      참가자
      • 글작성 : 0
      • 답글작성 : 40

      음 질문의 요지가 파악하기 힘들지만 많이 급해보이셔서 일단 글을 적어봅니다

      제가 파악하기로 마지막 사진의 에러를 문제로 여기셔서 글을 작성하신 것 같은데요. 에러가 이야기하고 있는 것은 players라고 하는 인스턴스의 프로퍼티는 TeamElement라고 하는 타입에서 사용을 할 수 없다고 하는 것 같습니다. 에러를 통해서 짐작하면 저는 작성자께서 타입과 인스턴스의 차이를 잘 이해하지 못하신 것과 더불어 enum을 잘 이해하지 못하신 게 아닌가 생각되는데요. 어쨌거나 구조체 Player의 playerType: PlayerType을 디코딩을 하시고 싶으신 거라면

      ...
      let playerType = try container.decode(String.self, forKey: .playerType)
      self.playType = PlayerType(rawValue: playerType)
      ...
      

      위처럼 사용해볼 수 있을 것 같으나 옵셔널에 대한 처리가 필요할 수 있을 것 같네요.

    • 재우 유
      참가자
      • 글작성 : 1
      • 답글작성 : 1

      제가 너무 멘탈이 나가 있었어서 질문도 정신 없게 한것 같네요…

      스크린샷 2022-03-05 오후 11.19.35

      우선 첫번째 질문은 이 부분에서

      let players: [Player]
      let coaches: [Coach]

      이 부분에 대한 디코딩이 어떤 방식으로 이루어지는 지 궁금하고

       

      스크린샷 2022-03-05 오후 11.24.00

      let playerType: PlayerType

      이 부분에 대한 디코딩 방식이 어떤 식으로 이루어지는 지 궁금합니다.

      일반적인 상수에 대한 디코딩이 아닌 배열형식이나 구조체에 대한 디코딩 방식에 대해 이해를 못하고 있는거 같습니다. ㅠㅜ

      처음 질문을 올렸을 때에는 1주 동안 한참을 헤메어서 답답한 마음에 이런 방식 저런 방식 안가리고 마구잡이로 하다가 그런 실수를 범한것 같네요.

       

      주석 처리한 코드는 같은 방식으로 오류가 나서 우선 주석처리를 해두었습니다.

      스크린샷 2022-03-05 오후 11.30.08

      스크린샷 2022-03-05 오후 11.30.25

      아직 Swift에 대한 이해도가 많이 부족하여 서툰 점 이해 부탁드립니다… ㅠㅜ

      개인 프로젝트를 진행 중에 마지막 작업인 API 데이터 처리 부분에서 1~2주동안 막혀있어서 너무 답답하네요…

       

    • rhrnakrnakr
      참가자
      • 글작성 : 0
      • 답글작성 : 40

      음… 디코딩이 어떤 방식으로 이루어지는지 궁금하다고 하셨는데 애플이 만들어놓은 부분을 사용하신 것으로 보여서 제가 뭐라 드릴 이야기가 없네요. 애플이 아마 알아서 잘 구현을 해놓았을 것 같습니다.

      저는 struct Player의 let playerType: PlayerType처럼 서버에서 내려주는 값을 enum으로 랩핑해서 사용하는 경우가 아니라면 굳이 init(decoder:)를 직접 구현하는 경우는 보지 못한 것 같습니다.

      그리고 제가 작성해서 드린 코드와 작성자분께서 치신 코드에는 차이가 있어보이네요.

      이후에는 아마 에러를 읽어보시고 이해하려는 노력을 해보시면 충분히 해결할 수 있으실 것 같습니다.

      • 이 답변은 rhrnakrnakr에 의해 2 years, 8 months 전에 수정됐습니다.
3 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom