프로젝트 구조
이전 포스팅에 이어서 프로젝트에 대해 분석을 하면서 Alamofire의 기능들을 공부해볼려고 한다.
해당 프로젝트의 디자인 패턴은 MVC구조로 되어있고 Model 부분은 Networking 폴더안에, View는 스토리보드 파일로 표현하였고, Controller 부분은 ViewController 폴더안에 있다. 우선 Model 쪽을 먼저 확인을 해야겠다.
Model
Networking 폴더 안에는 총 5가지의 파일이 있는데 해당 파일들을 분석해서 요약을 해보았다.
⚫ Displayable.swift : 모델 데이터를 get방식으로 view의 표시하기 위한 프로토콜
⚫ Film.swift : 스타워즈 영화 정보에 대한 모델 데이터
⚫ Films.swift : 영화 정보에 대한 데이터들과 개수를 표시하는 모델 데이터
⚫ Starship.swift : 우주선 정보에 대한 모델 데이터
⚫ Starships.swift : 우주선 정보에 대한 데이터들과 개수를 표시하는 모델 데이터
Displayable.swift
//View에 표시할 변수들을 get방식(읽기전용)으로 받기위한 프로토콜 선언
protocol Displayable {
var titleLabelText: String { get }
var subtitleLabelText: String { get }
var item1: (label: String, value: String) { get }
var item2: (label: String, value: String) { get }
var item3: (label: String, value: String) { get }
var listTitle: String { get }
var listItems: [String] { get }
}
get 방식(읽기 전용)으로 해당 변수를 사용할 수 있는 프로토콜이다.
Film.swift
//서버에서 받은 값을 디코딩하기 위한 Decodable 구조체
struct Film: Decodable {
let id: Int
let title: String
let openingCrawl: String
let director: String
let producer: String
let releaseDate: String
let starships: [String]
//CodingKey : 해당 case name을 사용하여 JSON 키 값 접근
enum CodingKeys: String, CodingKey {
case id = "episode_id"
case title
case openingCrawl = "opening_crawl"
case director
case producer
case releaseDate = "release_date"
case starships
}
}
서버에서 받은 데이터를 저장하기 위한 Decodable 타입의 Film 구조체를 생성하였다. JSON 데이터를 사용하기 위해서는 데이터를 인코딩, 디코딩을 통해 변환해야지 사용할 수 있는데, 서버에서 데이터를 가져올 때는 JSON 데이터를 프로젝트에 맞는 데이터로 디코딩을 하고 반대의 경우에는 인코딩을 한다. 이 프로젝트에서는 서버에서 데이터를 받아오기만 하고 보내지는 않기 때문에 Decodable 자료형을 사용하였다.
CodingKeys는 CodingKey를 통해 JSON의 키값과 구조체의 키 값을 맞춰준다. 예를 들어 Film의 id 상수에 저장될 데이터의 JSON 키값은 "episode_id"이기 때문에 id = "episode_id"로 맞춰준것 이다. JSON의 키값과 구조체의 키값이 일치하면 그냥 구조체의 상수명만 선언한다.
//View에 나타낼 데이터 extension
extension Film: Displayable {
var titleLabelText: String {
title
}
var subtitleLabelText: String {
"Episode \(String(id))"
}
var item1: (label: String, value: String) {
("DIRECTOR", director)
}
var item2: (label: String, value: String) {
("PRODUCER", producer)
}
var item3: (label: String, value: String) {
("RELEASE DATE", releaseDate)
}
var listTitle: String {
"STARSHIPS"
}
var listItems: [String] {
starships
}
}
그 다음에 앞서 선언한 Displayable 프로토콜을 extension하여 Film안에 데이터들을 읽기 전용으로 사용할 수 있도록 하기위한 extension이다.
Films.swift
struct Films: Decodable {
let count: Int
let all: [Film]
enum CodingKeys: String, CodingKey {
case count
case all = "results"
}
}
Film의 구조체는 영화 1개의 정보라면 Films 구조체는 모든 영화의 정보를 담는 Film의 배열과 그 개수가 들어있는 구조체이다.
starship과 starships도 똑같은 맥락이므로 생략
View
View의 로직을 보면 총 2개의 View가 NavigationView로 연결되어 있다. Main View에는 starship을 검색할 수 있는 SearchBar 아래에 해당 리스트를 표시하는 TableView로 구성되어 있고 Detail View에는 해당 데이터에 대한 상세정보가 나오는 View이다. Detail View 안에 있는 Table View에는 starship에 관련된 데이터이면 그 starship이 나오는 Film의 title을 나열하고 반대로 Film에 관련된 데이터이면 해당 Film에 나오는 starship의 title을 나열한다.
Alamofire에 관련된 내용이 아직도 안나오고 있다. 🙄
swift 카테고리를 새로 파가지고 이런 부분은 이제 넘어가야될 것 같다.
Uploaded by Notion2Tistory v1.1.0