
NumberFomatter()는 price에 1000단위로 (,)를 추가하기 위해서 사용한 기능이다.
Swift에서 숫자를 형식화하여 문자열로 변환할 때 NumberFormatter 클래스를 사용할 수 있다고 한다.
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
if let formattedPrice = formatter.string(from: NSNumber(value: wishData.getPrice())) {
uiPriceLabel.text = "\(formattedPrice) $"
} else {
uiPriceLabel.text = "\(wishData.getPrice()) $"
}
당겨서 새로고침하는 기능은 어플을 사용하면서 많이 경험해봤다.
refreshControl은 그 기능을 추가할 수 있다.
원래는 변수를 새로 할당해서 추가하는게 일반적이지만, 아래의 코드는 UITableViewController에서 작성이 되었기 때문에 자체적으로 가지고 있는 refreshControl?을 언래핑해서 사용하게 되었다.
// ....생략....
func setTableView() {
tableView.dataSource = self
tableView.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
if let refreshControl = tableView.refreshControl {
refreshControl.addTarget(self, action: #selector(refreshData(_:)), for: .valueChanged)
refreshControl.attributedTitle = NSAttributedString(string: "당겨서 새로고침")
} else {
let newRefreshControl = UIRefreshControl()
newRefreshControl.addTarget(self, action: #selector(refreshData(_:)), for: .valueChanged)
newRefreshControl.attributedTitle = NSAttributedString(string: "당겨서 새로고침")
tableView.refreshControl = newRefreshControl
}
}
// ....생략....
@objc func refreshData(_ sender: UIRefreshControl) {
self.wishListDatas = self.wishListDataManager.readData()
self.tableView.reloadData()
refreshControl?.endRefreshing()
}
Core Data는 원하는 데이터를 어플 내부에 저장할 수 있기 때문에 프레임워크를 import하는 것부터 시작해서 Entity 생성과 Attribute 추가 그리고 아래의 코드를 작성해서 데이터를 다룰 수 있다.
class WishListDataManager {
var persistentContainer: NSPersistentContainer? {
(UIApplication.shared.delegate as? AppDelegate)?.persistentContainer
}
func createData(wishData: WishData) {
guard let viewContext = self.persistentContainer?.viewContext else {
print("Error: Can't access Core Data view context")
return
}
let newWishData = WishListData(context: viewContext)
newWishData.id = wishData.getId()
newWishData.name = wishData.getName()
newWishData.descriptions = wishData.getDescriptions()
newWishData.price = wishData.getPrice()
newWishData.thumbnail = wishData.getThumbnail()
do {
try viewContext.save()
print("Data saved successfully")
} catch {
print("Failed to save data: \(error.localizedDescription)")
}
}
func readData() -> [WishListData] {
guard let viewContext = self.persistentContainer?.viewContext else {
print("Error: Can't access Core Data view context")
return []
}
let request = WishListData.fetchRequest()
do {
let wishListDatas = try viewContext.fetch(request)
return wishListDatas
} catch {
print("Error fetching data from CoreData: \(error.localizedDescription)")
return []
}
}
func deleteData(at index: Int) {
guard let viewContext = self.persistentContainer?.viewContext else {
print("Error: Can't access Core Data view context")
return
}
let request = WishListData.fetchRequest()
do {
let wishListDatas = try viewContext.fetch(request)
// 인덱스 유효성 검사
guard wishListDatas.indices.contains(index) else {
print("Error: Index out of range")
return
}
// 인덱스에 해당하는 데이터 삭제
let dataToDelete = wishListDatas[index]
viewContext.delete(dataToDelete)
// 변경 사항 저장
try viewContext.save()
print("Data deleted successfully")
} catch {
print("Failed to delete data: \(error.localizedDescription)")
}
}
}
이번 주에 진행한 과제에서 URL Session과 Core Data, NumberFomatter() 그리고 refreshControl 같은 기능들을 처음 사용했다. 확실히 처음 사용하는 기능들은 많은 오류를 겪어가면서 개발이 되는것 같다.
그렇다고 해서 기존에 사용했던 기능들도 오류가 안났던 건 아니였다..
이게 새로운 기능들을 배울 때마다 기존에 사용했던 기능들을 하나씩 잊어가는 느낌이다.. 결국에는 프로젝트를 많이 만들면서 많이 사용해봐야 머리보다는 손에 익어서 자연스럽게 사용할 수 있을 것 같다.