210407 Wed

Sunny·2021년 4월 8일
0

Today I Learned

목록 보기
29/88

얄팍한 코딩사전

뇌깨우기용으로 아침에 본 영상들..ㅎ

프로세스는 뭐고 스레드는 뭔가요?

객체지향 프로그래밍이 뭔가요?

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을 보내야지...ㅎ

출처:

[ZeddiOS] iOS ) Decodable

Protocol: KeyedEncodingContainerProtocol

커스텀 타입 인코딩 및 디코딩 by 철이의 컴노리

Swift :: Codable 알아보기 by 상어

profile
iOS Developer

0개의 댓글