Decodable
프로토콜을 활용하여 디코딩 가능한 타입으로 지정CodingKeys
열거형과 CodingKey
프로토콜을 활용하여 JSON 키 값을 커스터마이징하여 활용JSON
, TableView
학습 @활동학습JSON
데이터를 디코딩하기 위한 모델 구현 방법 학습프로토콜
A: Attribute, B: Relationship, C: Multiplier, D: Constant
Linked List
시간 복잡도
?형 옵셔널
로 정의한다.Decodable
프로토콜을 채택한다.Decodable
을 준수하는 기본 자료형(String, Int, Double 등)인 경우에는 별도 작업 없이 프로토콜 준수함Decodable
프로토콜을 준수하도록 init(from decoder: Decoder)
이니셜라이저를 별도로 작성한다.키
의 이름을 변경하고자 할 경우에는 모델 타입 내에 CodingKeys
열거형을 작성한다. CodingKeys
타입이 String
타입과 CodingKey
프로토콜을 따르도록 하여 변경하고자 하는 이름을 case
에, JSON 데이터에 기록된 키 값을 rawValue
에 작성한다.//JSON
[
{
"name": "Ryan",
"image_name": "Ryan-Profile-Photo" ,
"age: 10,
"short_desc": "Enthusiastic iOS Developer, I'M ON FIRE!"
},
{
"name": "Kio",
"image_name": "Kio-Profile-Photo",
"age: 10,
"short_desc": "Hey, are you interested in Swift? Join us!"
}
// Model Type
struct Person: Decodable {
let name: String
let imageName: String
let age: Int
let shortDescription: String
private enum CodingKeys: String, CodingKey {
case name
case imageName = "image_name"
case shortDescription = "short_desc"
}
}
통신을 통해 컴퓨터 간 데이터를 주고 받을 때 규칙이 있어야 송신자와 수신자가 동일한 내용을 볼 수 있습니다. JSON
은 이름과 마찬가지로 JavaScript
의 객체 표기법으로, 합리적인 표기법으로 인정 받아 표준처럼 JavaScript
형식을 차용해서 쓰고 있습니다. 표현 방법은 아래와 같습니다.
{ }: 객체 (딕셔너리, 키와 값으로 이루어져 있음)
[]: 배열
" ": 문자열
123: 수
true/false: Boolean
null: 빈 값 (nil)
// 예시 객체
{
"이름": "홍길동":,
"나이": 150,
"성별", "남"
}
JSON
이전에는 Extensible Markup Language (XML)
을 사용하였습니다. 실제 성능은 XML
이 더 좋았으나 JSON
이 더 가독성이 좋다는 이유로 변경하였으나, 근래 컴퓨터 성능이 좋아져 큰 차이는 없다고 알려져 있습니다. 아래는 XML
예시입니다."그렇게 인간 친화적이지도 않고 기계 친화적이지도 않은 XML을 버리고 차라리 인간 친화적인 JSON을 쓰자."
서비스에 회원가입하는 경우 앱에서 만든 사용자 정보를 서버로 보내주어야 합니다. 이 과정에서 앞서 언급한 이유로 인해 약속된 형태로 서버로 보내주어야 하는데, 이 때 JSON 방식으로 인코딩해서 보냅니다.
환경설정, 연락처, 친구 목록 등에 사용하고 있는 하나의 열 (column)에 여러 행 (row)
이 있는 리스트 형식의 View입니다. TableView
자신과 함께 delegate
와 dataSource
가 TableView
작동에 주요한 역할을 수행합니다.
Source: Apple Developer
Table View
의 모양과 동작을 관리하는 컨트롤러와 관련된 요소로, 다음 기능들을 관리하기 위해 UITableViewDelegate
프로토콜의 메서드들을 사용합니다.
header
, footer view
생성 및 관리row
, header
, footer
들에 대한 높이 지정row
컨텐츠 들여쓰기 (indent)row
선택에 대한 반응table row
들에 대한 스와이프 및 기타 동작에 대한 반응
Source: Apple Developer
애플리케이션의 데이터 모델과 관련된 요소입니다. Table View
는 자신의 데이터를 보여주는 것만 관리하고, 데이터 자체는 dataSource
가 관리합니다. 이외에 dataSource
가 수행하는 역할은 아래와 같습니다.
section
과 row
들의 개수를 알려줍니다.row
에 대해 cell
들을 제공해줍니다.Section header
, footer
에 제목을 제공해줍니다.index
가 있다면 index 대로 구성해줍니다.User
: 앱을 켜야지~Table View -> Table View Datasource
: 보여줘야 하는 Section의 수는 몇 개입니까?Table View -> Table View Datasource
: Section 0은(는) 몇 개의 Row를 보여줘야 합니까?...중략...
Table View -> Table View Datasource
: Section 9은(는) 몇 개의 Row를 보여줘야 합니까?Table View -> Table View Datasource
: (0, 0) IndexPath에 보여줄 Cell을 주십시오!!!Table View Data source -> Cell Reuse Queue
: (0, 0) IndexPath에 보여줄 셀인데, Cell Reuse Identifier에 해당하는 Cell을 주십시오!!!Cell Reuse Queue -> Table View Data source
: Cell Reuse Identifier에 해당하는 Cell 중 대기중인 Cell이 없어 새로 만들어 드릴게요.Table View Data source -> Cell Reuse Queue
: (0, 1) IndexPath에 보여줄 셀인데, Cell Reuse Identifier에 해당하는 Cell을 주십시오Cell Reuse Queue -> Table View Data source
: Cell Reuse Identifier에 해당하는 Cell 중 대기중인 Cell이 없어 새로 만들어 드릴게요.Table View Data source -> Cell Reuse Queue
: (0, 2) IndexPath에 보여줄 셀인데, Cell Reuse Identifier에 해당하는 Cell을 주십시오Cell Reuse Queue -> Table View Data source
: Cell Reuse Identifier에 해당하는 Cell 중 대기중인 Cell이 없어 새로 만들어 드릴게요.User
: 아래로 스크롤 해야지 스크롤Table View -> Table View Data source
: (1, 0) IndexPath에 보여줄 셀인데, Cell Reuse Identifier에 해당하는 Cell을 주십시오Cell Reuse Queue -> Table View Data source
: Cell Reuse Identifier에 해당하는 Cell 중 대기중인 Cell이 없어 새로 만들어 드릴게요....중략...
Table View -> Table View Data source
: (9, 0) IndexPath에 보여줄 셀인데, Cell Reuse Identifier에 해당하는 Cell을 주십시오Cell Reuse Queue -> Table View Data source
: Cell Reuse Identifier에 해당하는 Cell 중 대기중인 Cell이 없어 새로 만들어 드릴게요.User
: 위로 스크롤 해야지 스크롤Table View -> Table View Data source
: (7, 2) IndexPath에 보여줄 셀인데, Cell Reuse Identifier에 해당하는 Cell을 주십시오Cell Reuse Queue -> Table View Data source
: Cell Reuse Identifier에 해당하는 Cell 중에 대기중인 Cell이 있어요. 드릴게요....중략...
Table View -> Table View Delegate
: Section 5은(는) 몇 개의 Row를 보여줘야 합니까?Table View -> Table View Data source
: (5, 1) IndexPath에 보여줄 셀인데, Cell Reuse Identifier에 해당하는 Cell을 주십시오Cell Reuse Queue -> Table View Data source
: Cell Reuse Identifier에 해당하는 Cell 중에 대기중인 Cell이 있어요. 드릴게요.User
: 5, 2 셀 터치!!Table View -> Table View Delegate
: 사용자가 5, 2의 row를 선택했다구!Table View Delegate
: 얼럿을 띄워야지cell
을 필요할 때마다 만들면 리소스 낭비가 커짐.view
를 만들고 그리는 일이 가장 힘든 일이다. 이왕 만들어둔거 없애지 말고 대기열에 놨다가 필요하면 가져오자.prototype cell
을 복사해와서 만든다.queue
에 넣는다.Stack
으로도 구현 가능할 것으로 예상. 하지만 데이터의 진행 방향이 queue
와는 달라 병목 현상이 예상된다.JSON
데이터를 받으면 viewDidLoad
시점에 알아야 함. 엄밀히 말하면, awakeFromNib
에서 . 네트워크를 통해 받아와야 한다면 내용이 달라짐. 네트워크에 통신 요청은 최대한 빨리하는게 좋음. 받으면 바로 보여주면 되니까. 보통 통신 요청은 viewWillAppear
또는 viewDidLoad
시점에 자주 함.