Swift Method

2024. 5. 29. 16:42iOS

1. prepare 메서드

 

2. destination

 

3. failible initializer

 

4. % 인코딩

 

5. 완성된 앱의 Main.storyboard

- Tab bar Controller Scene: 탭 바를 제어하며 해당 탭 클릭 시 해당 Scene으로 이동

- box office Scene: 박스오피스 순위 테이블

- theater Scene: 웹사이트를 통해 영화관 위치 검색

- Detail View Scene: box office Scene에서 테이블 터치 시 해당 Scene으로 이동되며, 웹사이트에서 해당 영화를 검색한 페이지가 출력됨

 

6. 생성형 AI를 통해 소스 리팩토링

import UIKit

// 모델 정의
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=53cc2dbb883893178b350d72d53fc0e6&targetDt="
    
    private let dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyyMMdd"
        return formatter
    }()
    
    private let numberFormatter: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        return formatter
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        table.delegate = self
        table.dataSource = self
        movieURL += makeYesterdayString()
        getData()
    }
    
    func makeYesterdayString() -> String {
        guard let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date()) else { return "" }
        return dateFormatter.string(from: yesterday)
    }
    
    func getData() {
        guard let url = URL(string: movieURL) else { return }
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url) { [weak self] data, response, error in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            guard let self = self, let JSONData = data else { return }
            do {
                let decodedData = try JSONDecoder().decode(MovieData.self, from: JSONData)
                self.movieData = decodedData
                DispatchQueue.main.async {
                    self.table.reloadData()
                }
            } catch {
                print(error.localizedDescription)
            }
        }
        task.resume()
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return movieData?.boxOfficeResult.dailyBoxOfficeList.count ?? 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as? MyTableViewCell,
              let movie = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row] else {
            return UITableViewCell()
        }
        
        cell.movieName.text = "[\(movie.rank)위] \(movie.movieNm)"
        
        if let audienceAccumulate = Int(movie.audiAcc), let audienceCount = Int(movie.audiCnt) {
            cell.audiAccumulate.text = "누적: \(numberFormatter.string(for: audienceAccumulate)!)명"
            cell.audiCount.text = "어제: \(numberFormatter.string(for: audienceCount)!)명"
        }
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return "🍿박스오피스(영화진흥위원회제공:\(makeYesterdayString()))🍿"
    }
    
    func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
        return "😃 by smj"
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let dest = segue.destination as? DetailViewController,
           let myIndexPath = table.indexPathForSelectedRow,
           let movieName = movieData?.boxOfficeResult.dailyBoxOfficeList[myIndexPath.row].movieNm {
            dest.movieName = movieName
        }
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(indexPath.description)
    }
}

 

 

- 참고자료: iOS 프로그래밍 실무 강의  - 한성현 교수님

'iOS' 카테고리의 다른 글

Auto Layout  (0) 2024.05.22
networking, encoding  (0) 2024.05.08
OpenAPI, RESTful  (0) 2024.05.01
앱 개발 실습 - 2  (0) 2024.04.17
앱 개발 실습 - 1  (0) 2024.04.03