
테이블 뷰를 이용하여 만들 것 이기 때문에 화면 가득 채워줍니다


table view와 label에 대해 Constraints제약 조건을 설정해줘요


여기서 3번째 단계가 가장 어려운 과정 중 하나에요

옵셔널을 푸는방법은 if let을 이용하면 해제가 되지만 guard let~else를 이용하는 것을 추천합니다.

후행 클로저 스타일로 바꾸려면

엔터를 눌러주면 자동으로 바뀌게 되어집니다.

옵셔널을 해제하여 dataString을 출력해주면 터미널창에 데이터들을 불러오는것을 확인 할 수 있어요

영화 정보들을 quick type 사이트에서 변환할 수 있어요
import Foundation
// MARK: - Welcome
struct Welcome: Codable {
let boxOfficeResult: BoxOfficeResult
}
// MARK: - BoxOfficeResult
struct BoxOfficeResult: Codable {
let boxofficeType, showRange: String
let dailyBoxOfficeList: [DailyBoxOfficeList]
}
// MARK: - DailyBoxOfficeList
struct DailyBoxOfficeList: Codable {
let rnum, rank, rankInten: String
let rankOldAndNew: RankOldAndNew
let movieCD, movieNm, openDt, salesAmt: String
let salesShare, salesInten, salesChange, salesAcc: String
let audiCnt, audiInten, audiChange, audiAcc: String
let scrnCnt, showCnt: String
enum CodingKeys: String, CodingKey {
case rnum, rank, rankInten, rankOldAndNew
case movieCD = "movieCd"
case movieNm, openDt, salesAmt, salesShare, salesInten, salesChange, salesAcc, audiCnt, audiInten, audiChange, audiAcc, scrnCnt, showCnt
}
}
enum RankOldAndNew: String, Codable {
case old = "OLD"
}AI가 변환 해준 코드 (아래)
struct MovieData: Codable {
let boxOfficeResult: BoxOfficeResult
struct BoxOfficeResult: Codable {
let boxofficeType: String
let showRange: String
let dailyBoxOfficeList: [DailyBoxOffice]
struct DailyBoxOffice: Codable {
let rnum: String
let rank: String
let rankInten: String
let rankOldAndNew: String
let movieCd: String
let movieNm: String
let openDt: String
let salesAmt: String
let salesShare: String
let salesInten: String
let salesChange: String
let salesAcc: String
let audiCnt: String
let audiInten: String
let audiChange: String
let audiAcc: String
let scrnCnt: String
let showCnt: String
}
}
}let decoder = JSONDecoder()
do {
let movieData = try decoder.decode(MovieData.self, from: jsonData)
let firstMovie = movieData.boxOfficeResult.dailyBoxOfficeList[0]
print("1위 영화: \(firstMovie.movieNm)")
print("관객수: \(firstMovie.audiCnt)명")
} catch {
print("파싱 에러: \(error)")
}
아래 사진에서 에러 뜨는 이유가 뭘까요?
타입 자체(구조체나 클래스의 타입)를 인스턴스처럼 쓰려 할 때 .self를 써서 명확히 타입임을 알려야 함
여기서 MovieData는 구조체 타입(자료형)이지 인스턴스가 아님

데이터가 변경되거나 새로 들어온 경우, 테이블뷰 전체를 다시 그리도록 요청하는 메서드에요
클로저 내부에서는 property접근시 self.을 써야 하므로 이렇게 에러가 발생합니다.

iOS앱을 만들때는 tableview를 이용하는게 가장 기본이 되고 기초적이면서 가장 중요해요