본문 바로가기
프로그래밍/iOS

[iOS] Swift 공부 - 23

by Cian 2024. 5. 30.

▶ 코드 리팩토링

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