▶ 코드 리팩토링
import UIKit
// 영화 이름 배열
let name = ["aaa", "bbb", "ccc", "ddd", "eee"]
// 영화 데이터 구조체
struct MovieData: Codable {
let boxOfficeResult: BoxOfficeResult
}
// 박스 오피스 결과 구조체
struct BoxOfficeResult: Codable {
let dailyBoxOfficeList: [DailyBoxOfficeList]
}
// 일일 박스 오피스 목록 구조체
struct DailyBoxOfficeList: Codable {
let movieNm: String // 영화 이름
let audiCnt: String // 일일 관객 수
let audiAcc: String // 누적 관객 수
let rank: String // 순위
}
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
// 테이블 뷰 아웃렛
@IBOutlet weak var table: UITableView!
var movieData: MovieData? // 영화 데이터
var movieURL = "https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=0769158cced81e9cdf789de5f44f46b5&targetDt="
override func viewDidLoad() {
super.viewDidLoad()
table.delegate = self
table.dataSource = self
// 어제 날짜 문자열 생성 및 API 요청
movieURL += makeYesterdayString()
getData()
}
// 어제 날짜 문자열 생성
func makeYesterdayString() -> String {
let calendar = Calendar.current
if let yesterday = calendar.date(byAdding: .day, value: -1, to: Date()) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYYMMdd"
return dateFormatter.string(from: yesterday)
}
return "날짜 변환에 실패하였습니다."
}
// 영화 데이터 가져오기
func getData() {
guard let url = URL(string: movieURL) else { return }
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { data, response, error in
if let error = error {
print("Error: \(error)")
return
}
guard let JSONdata = data else { return }
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(MovieData.self, from: JSONdata)
self.movieData = decodedData
DispatchQueue.main.async {
self.table.reloadData()
}
} catch {
print("Error decoding JSON: \(error)")
}
}
task.resume()
}
// 테이블 뷰 데이터 소스
// 섹션당 행 수
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return movieData?.boxOfficeResult.dailyBoxOfficeList.count ?? 0
}
// 셀 설정
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! MyTableViewCell
guard let movie = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row] else { return UITableViewCell() }
cell.movieName.text = "[\(movie.rank)위] \(movie.movieNm)"
cell.audiAccumulate.text = "누적 : \(movie.audiAcc)명"
if let audiCnt = Int(movie.audiCnt) {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let formattedAudiCnt = formatter.string(for: audiCnt) ?? ""
cell.audiCount.text = "어제 : \(formattedAudiCnt)명"
}
return cell
}
// 섹션 제목 설정
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "🍿박스오피스(영화진흥위원회제공:\(makeYesterdayString()))🍿"
}
// 섹션 수
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
// 셀 선택 시
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(indexPath.description)
}
// 세그웨이를 통한 화면 전환 시 데이터 전달
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let dest = segue.destination as? DetailViewController,
let indexPath = table.indexPathForSelectedRow,
let movieName = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].movieNm {
dest.movieName = movieName
}
}
}
'프로그래밍 > iOS' 카테고리의 다른 글
Swift - Delegate란? (3) | 2024.09.11 |
---|---|
[iOS] Swift 공부 - 24 (1) | 2024.06.13 |
[iOS] Swift 공부 - 22 (0) | 2024.05.23 |
[iOS] Swift 공부 - 21 (0) | 2024.05.16 |
[iOS] Swift 공부 - 20 (0) | 2024.05.09 |