iOS
Swift Method
mJay8194
2024. 5. 29. 16:42
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 프로그래밍 실무 강의 - 한성현 교수님