210407 Wed
얄팍한 코딩사전
뇌깨우기용으로 아침에 본 영상들..ㅎ
1. 첫 번째 학습 내용: CodingKey 실습
CodingKey란 모다? 프로토콜이다!
인코딩 및 디코딩을 위한 키로 사용할 수 있는 타입
import Foundation
struct ItemsOfKorea : Codable {
let koreanTitle : String
let EnglishTitle : String
let shortDescription: String
let fullDescription: String
enum CodingKeys : String, CodingKey {
case koreanTitle = "name"
case EnglishTitle = "image_name"
case shortDescription = "short_desc"
case fullDescription = "desc"
}
}
json 첨부 파일을 보니 name이랑 imageName이랑 같은데 한국 이름, 영문명 이 차이라 이에 맞게 네이밍을 다시 바꿔줌.
후보 1. titleInKorean, titleInEnglish
후보 2. KoreanTitle, EnglishTitle
왠지 후보 2가 더 눈에 잘 들어오는 것 같아서 요 아이로 해줌
출처:
Swift ) 왕초보를 위한 Codable - CodingKey [ZeddiOS]
2. 두 번째 학습 내용: Decodable 에러처리
어제에 이어 (struct 타입으로 선언해줬던) Coffee 타입으로 실습
에러 처리를 해주려고 아래와 같이 해주면 아래와 같이 class 타입이 아닌 Coffee 타입에서 'required' initializer를 쓰지 말아라 요놈아!라고 에러가 남
'required' initializer in non-class type 'Coffee'
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.coffeeName = (try? container.decode(String.self, forKey: .coffeeName)) ?? "값이 없네유"
self.coffeePrice = (try? container.decode(Int.self, forKey: .coffeePrice)) ?? 0
}
제대로 이해한건지 모르겠디만
위의 코드의 의미는?
일단 self는 자기 자신이라고 생각하면 됨.
CodingKeys의 coffeeName에 값이 있으면 값을 받아오고 아니면 ?? "값이 없네유"를 출력해주라!
밑에도 마찬가지 coffeePrice가 있으면 Int형으로 가격을 출력해주고 아니면 ?? 0을 출력해주라!
체크할 놈들을 아예 괄호로 묶어줘버림
(try? container.decode(String.self, forKey: .coffeeName))
(try? container.decode(Int.self, forKey: .coffeePrice))
-
전체 코드
import Foundation class Coffee : Codable { var coffeeName : String var coffeePrice : Int enum CodingKeys: String, CodingKey { case coffeeName case coffeePrice } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.coffeeName = (try? container.decode(String.self, forKey: .coffeeName)) ?? "값이 없네유" self.coffeePrice = (try? container.decode(Int.self, forKey: .coffeePrice)) ?? 0 } } let jsonString = """ { "coffeeName" : "카페 라떼", "coffeePrice" : 4000 } """ let decoder = JSONDecoder() var data = jsonString.data(using: .utf8) if let data = data, let myCoffee = try? decoder.decode(Coffee.self, from: data) { print(myCoffee.coffeeName) print(myCoffee.coffeePrice) }
-
coffeeName 값이 없는 경우
값이 없네유 정상적으로 출력
-
coffeePrice 값이 없는 경우
사실 이번 프로젝트에서는 (json 파일에 누락된 내용이 없다는 전제하에)
required init을 반드시? 써줘야 할 필요는 없다고 생각했다 흠... 🤔
container란? (정확히 뭐라고 이해해야 할런지...)
decode한 프로퍼티 값을 보관해주는 일종의 decoder's storage (보관소)로 생각했다
사실 공부하면서도 뭐가 뭔지 아직 모르겠따 😣
정말 딱 타입 구현만 해서 Step1 PR을 보내야지...ㅎ
출처:
Protocol: KeyedEncodingContainerProtocol
커스텀 타입 인코딩 및 디코딩 by 철이의 컴노리
Swift :: Codable 알아보기 by 상어
Author And Source
이 문제에 관하여(210407 Wed), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sunnywhynot/210407-Wed저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)