브래의 슬기로운 코딩 생활
iOS 프로그래밍 실무 13주차 정리 본문
- 과제 -
func multiplyByTen(value: Int) {
print(value*10)
}multiplyByTen(value: 3) //30
강제 언래핑
func multiplyByTen(value: Int?) {
print(value!*10) //강제 언래핑
}multiplyByTen(value: 3) //30
if let 옵셔널 바인딩
func multiplyByTen(value: Int?) {
if let value{
print(value*10) //if let 옵셔널 바인딩
}}multiplyByTen(value: 3) //30
func multiplyByTen(value: Int?) {
if let value{
print(value*10) //if let 옵셔널 바인딩
}else
{ print("닐리리야")
}}multiplyByTen(value: nil) //닐리리야
guard let ~ else 옵셔널 바인딩
func multiplyByTen(value: Int?) {
guard let value else{
print("nil")
return
}print(value*10)
}multiplyByTen(value: 3)
multiplyByTen(value: nil)
스위프트 prepare메소드에서 indexpath.row를 알아내는 법이 뭐니
ChatGPT
Swift의 prepare(for:sender:) 메서드에서 indexPath.row를 알아내려면 해당 메서드가 호출되는 시점에서 sender 매개변수를 사용하여 indexPath를 추출해야 합니다.
일반적으로 prepare(for:sender:) 메서드는 UIStoryboardSegue 객체를 전달받는데, 이 객체는 source와 destination 뷰 컨트롤러를 가지고 있습니다. sender 매개변수를 통해 해당 세그웨이를 시작시킨 객체를 확인하고 적절한 처리를 할 수 있습니다.
sender 매개변수를 적절한 타입으로 다운캐스팅한 후 해당 객체의 정보를 사용하여 indexPath를 추출할 수 있습니다. 예를 들어, sender가 UITableViewCell인 경우 다음과 같은 방법으로 indexPath를 얻을 수 있습니다:
swift
Copy code
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let cell = sender as? UITableViewCell,
let indexPath = tableView.indexPath(for: cell) {
let row = indexPath.row
// row를 사용하여 필요한 작업 수행
}
}
여기서 tableView는 현재 작업 중인 테이블 뷰를 가리킵니다. tableView.indexPath(for:) 메서드를 사용하여 UITableViewCell의 indexPath를 가져올 수 있습니다. 이렇게 하면 indexPath.row를 얻을 수 있습니다.
prepare(for:sender:) 메서드는 다른 종류의 객체(예: 버튼, 콜렉션 뷰 셀 등)를 sender로 받을 수도 있으므로, 적절한 다운캐스팅 및 객체의 종류에 따라 적절한 처리를 해주어야 합니다.
import WebKit
import UIKit
class DetailViewController: UIViewController {
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var webView: WKWebView!
var movieName =""
override func viewDidLoad() {
super.viewDidLoad()
//nameLabel.text = movieName
navigationItem.title = movieName
//let urlKorString = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query="+movieName
let urlKorString ="https://namu.wiki/w/"+movieName
// let urlKorString = "https://map.naver.com/v5/search/영화관"
let urlString = urlKorString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
guard let url = URL(string: urlString) else { return }
let request = URLRequest(url: url)
webView.load(request)
}
import UIKit
struct MovieData: Codable {
let boxOfficeResult: BoxOfficeResult
}
// MARK: - BoxOfficeResult
struct BoxOfficeResult: Codable {
let dailyBoxOfficeList: [DailyBoxOfficeList]
}
// MARK: - DailyBoxOfficeList
struct DailyBoxOfficeList: Codable {
let movieNm : String
let audiAcc : String
let audiCnt : String
}
let movie = ["슈퍼 마리오 브라더스","드림", "존 윅 4","스즈메의 문단속", "옥수역귀신", "리바운드", "더 퍼스트 슬램덩크", "렌필드", "킬링 로멘스", "무명"]
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
var movieData : MovieData?
var movieURL ="https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=9080505dec68de180c3367f5ff07061e&targetDt="
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) ->Int {
return movie.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! MyTableViewCell
cell.movieName.text = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].movieNm
cell.acc.text = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].audiAcc
cell.audi.text = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].audiCnt
if let aCnt = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].audiAcc {
let numF = NumberFormatter()
numF.numberStyle = .decimal
let aCount =Int(aCnt)!
let result = numF.string(for: aCount)!+"명"
cell.acc.text ="누적:\(result)"
//cell.audiCount.text = "어제:\(aCnt)명"
}
if let aCnt = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].audiCnt {
let numF = NumberFormatter()
numF.numberStyle = .decimal
let aCount =Int(aCnt)!
let result = numF.string(for: aCount)!+"명"
cell.audi.text ="어제:\(result)"
//cell.audiCount.text = "어제:\(aCnt)명"
}
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let dest = segue.destination as! DetailViewController
dest.movieName ="asd"
guard let myIndexPath = table.indexPathForSelectedRow else{
return
}
let row = myIndexPath.row
dest.movieName = (movieData?.boxOfficeResult.dailyBoxOfficeList[row].movieNm)!
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) ->String? {
return "박스오피스(영화진흥위원회제공:"+makeYesterdayString()+")"
}
func numberOfSections(in tableView: UITableView) ->Int {
return 1
}
func makeYesterdayString() ->String {
let y = Calendar.current.date(byAdding: .day, value: -1, to: Date())!
let dateF = DateFormatter()
dateF.dateFormat ="yyyyMMdd"
let day = dateF.string(from: y)
return day
}
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
table.delegate =self
table.dataSource =self
movieURL += makeYesterdayString()
getData()
}
func getData() {
guard let url = URL(string: movieURL) else {
print("Invalid URL")
return
}
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { [weak self] (data, response, error) in
guard let self =self else {
return
}
if let error = error {
print(error)
return
}
guard let JSONdata = data else {
print("No data received")
return
}
let decoder = JSONDecoder()
do {
let decodedData =try decoder.decode(MovieData.self, from: JSONdata)
print(decodedData.boxOfficeResult.dailyBoxOfficeList[0].movieNm)
self.movieData = decodedData
DispatchQueue.main.async {
self.table.reloadData()
}
} catch {
print(error)
}
}
task.resume()
}
}
import UIKit
class MyTableViewCell: UITableViewCell {
@IBOutlet weak var audi: UILabel!
@IBOutlet weak var acc: UILabel!
@IBOutlet weak var movieName: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
'2-1 > iOS프로그래밍 실무' 카테고리의 다른 글
iOS프로그래밍 실무 기말고사 정리 (0) | 2023.06.21 |
---|---|
iOS프로그래밍 실무 12주차 정리 (0) | 2023.05.24 |
iOS프로그래밍 실무 11주차 정리 (0) | 2023.05.17 |
iOS프로그래밍 실무 10주차 정리 (0) | 2023.05.10 |
iOS프로그래밍 실무 9주차 정리 (2) | 2023.05.03 |