티스토리 뷰

Develop/iOS

[iOS] Swift Codable

Nebori 2018. 9. 9. 23:29

Codable

이전에 JSON을 컨트롤하기 위해서는 'JSONSerialization' 클래스를 이용했습니다.
하지만 Swift 4.x 버전에서는 'Codable' 프로토콜을 이용해서 JSON 데이터를 쉽게 파싱할 수 있는 방법이 있습니다.
오늘은 저도 공부하면서 확인한 내용을 기록하도록 하겠습니다.

JSONSerialization

이전에 사용하던 가장 기본적인 JSON 값을 파싱하는 방법입니다.
서버에서 가져온 값은 대부분 JSON 값이 Data 로 전달받기때문에 변환하여 예제를 작성하였습니다.

let firstJSONText: String = """

{

"one": "1",

"two": 2,

"three": "3"

}

"""

let firstJSONData = firstJSONText.data(using: .utf8)

do {

    let firstJSONDictionary = try JSONSerialization.jsonObject(with: firstJSONData!, options: []) as! [String: Any]

    for key in firstJSONDictionary.keys {

        print(firstJSONDictionary[key]!)

    }

} catch  {

    print("catch")

}

Codable

기본 Codable

기본적인 Codable 사용 방법입니다.

struct JSONCodable: Codable {

    var one: String

    var two: Int

    var three: String

}

do {

    let JSONCodableDictionary = try! JSONDecoder().decode(JSONCodable.self, from: firstJSONData!)

    print(JSONCodableDictionary.one)

    print(JSONCodableDictionary.two)

    print(JSONCodableDictionary.three)

} catch {

    print("catch")

}

변수명이 다른 Codable

파싱하려는 데이터와 정의한 키가 이름이 다를경우에는 'CodingKey' 프로토콜을 이용해서
직접 매칭을 해주면 이상없이 파싱이 가능합니다.

스위프트에서는 변수명을 새로운 단어가 시작될 때 대문자를 사용하지만,
언어에 따라서 '_'로 나누는 경우가 있습니다.
ex) insert_user_id_code

물론 변수명을 똑같이 만들어도 에러는 발생하지 않지만
코드 일관성을 위해서 아래와 같이 코딩스타일을 유지하시는 것을 추천합니다.

struct JSONCodableOtherKey: Codable {

    var one: String

    var two: Int

    var third: String

    enum CodingKeys : String, CodingKey{

        case one

        case two

        case third = "three"

    }

}


do {

    let JSONCodableOtherDictionary = try! JSONDecoder().decode(JSONCodable.self, from: firstJSONData!)

    print(JSONCodableOtherDictionary.one)

    print(JSONCodableOtherDictionary.two)

    print(JSONCodableOtherDictionary.three)

} catch {

    print("catch")

}

오늘은 'Codable' 프로토콜의 기본에 대해서 알아보았습니다.
'Codable' 프로토콜의 장점은 Model을 미리 정의하고 Model에서 변수를 쉽게 접근이 가능하다는 점이라고 생각합니다.
'JSONSerialization'의 경우에는 Key값을 define 으로 정의해놓고 클래스에 직접 파싱을 해서 사용했었는데, 바로 'Codable' 프로토콜을 준수하는 Model만 정의한다면 바로 파싱이 가능한 것만보아도 편의성이 높아졌다고 볼 수 있습니다.

앞으로 사용하면서 이슈가 발생하면 따로 정리해서 올릴 수 있도록 하겠습니다.
그리고 위 코드를 혹시나 사용하신다면, !는 신중하게 사용하시기 바랍니다.
단순히 예제이기때문에 !를 남발했지만 실제로 서비스하는 코드의 경우에는 지양해야 할 방식입니다. 다른 방식으로 언래핑하여 사용하시기를 추천드립니다.
이번 한주도 고생하셨습니다!

'Develop > iOS' 카테고리의 다른 글

[SwiftBook] 타입 1/2  (0) 2018.09.19
[SwiftBook] 값  (0) 2018.09.18
[iOS] Swift QRCode 읽기  (0) 2018.08.26
[iOS] Swift 도형 그리기  (0) 2018.07.29
[iOS Developer Program] iOS 개인 개발자 등록  (0) 2018.02.26
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31