macOS

[iOS, macOS] Alamofire Framework(2)

Daesiker 2021. 3. 10. 18:05
반응형

프로젝트 구조

이전 포스팅에 이어서 프로젝트에 대해 분석을 하면서 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 카테고리를 새로 파가지고 이런 부분은 이제 넘어가야될 것 같다.

반응형

'macOS' 카테고리의 다른 글

[Swift] UserDefaults  (0) 2021.03.15
[iOS, macOS] Alamofire Framework(3)  (2) 2021.03.11
[iOS, macOS] Alamofire Framework(1)  (2) 2021.03.09
[iOS, macOS] QuickLook 프레임워크(2)  (0) 2021.03.07
[iOS, macOS] QuickLook 프레임워크(1)  (0) 2021.03.06