Content Configuration
→ iOS14부터 Cell의 각 UI요소에 직접 접근하여 콘텐츠를 설정하는 대신, Content Configuration을 사용하여 콘텐츠를 나타낸다
VoiceOver 기능을 통해 읽어주는 accessibility property
→ label, title, value, type
let storyboard = UIStoryboard(name: "Main", bundle: .main)
guard let itemInfoViewController = storyboard.instantiateViewController(identifier: "itemInfoVC") as? ItemInfoViewController else {
return
}
itemInfoViewController.paramTitle = self.itemsData[indexPath.row].name
itemInfoViewController.paramImage = self.itemsData[indexPath.row].imageName
itemInfoViewController.paramDescription = self.itemsData[indexPath.row].description
self.navigationController?.pushViewController(itemInfoViewController, animated: false)
매뉴얼 세그웨이나 액션 세그웨이에 구분 없이 모든 세그웨이가 실행되기 전에 iOS는 prepare(for: sender:) 메소드를 먼저 호출한다
//Segue identifier : ManualSegue
@IBAction func onPerformSegue(_ sender: Any) {
self.performSegue(withIdentifier: "ManualSegue", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let dest = segue.destination // 목적지 ViewController
guard let viewController = dest as? ItemInfoViewController else {
return
}
viewController.paramTitle = self.titleLabel.text
viewController.paramImage = self.imageView.image
viewController.paramDescription = self.descLabel.text
presentingViewController & presentedViewController
presentingViewController : 자신을 호출한 ViewController
presentedViewController : 자신이 호출한 ViewController
AppDelegate 객체에 값을 주고받기
//AppDelegate.swift
var items: [Item]?
var expo: Exposition?
--------------------
//ExpositionViewController.swift
override func viewDidLoad() {
decodeData()
}
private func decodeData() {
guard let dataAsset: NSDataAsset = NSDataAsset(name: "exposition_universelle_1900", bundle: .main) else {
return
}
do {
let ad = UIApplication.shared.delegate as? AppDelegate
ad?.expo = try JSONDecoder().decode(Exposition.self, from: dataAsset.data)
} catch {
implementErrorAlert(ExpoError.invalidExpoData)
}
}
//ExpositionViewController.swift
override func viewDidLoad() {
decodeData()
}
private func decodeData() {
guard let dataAsset: NSDataAsset = NSDataAsset(name: "exposition_universelle_1900", bundle: .main) else {
return
}
do {
let ud = UserDefaults.standard
let result = try JSONDecoder().decode(Exposition.self, from: dataAsset.data)
ud.set(result, forKey: "exposition")
} catch {
implementErrorAlert(ExpoError.invalidExpoData)
}
}
// 공부 중...
고차함수를 하기 전에 일단 closure에 대한 이해가 필요하다
closure
일급 객체이자, 함수명이 없는 함수
일급객체?? 위키 - 일급객체
→ 축약시 너무 많이 줄이면 (타입을 생략) ⇒ 컴파일러가 컴파일하는 시간이 늘어난다
컬렉션 내부의 기존 데이터를 변형(transform)하여 새로운 컬렉션 생성
container.map(f(x)) 컨테이너의 map 메서드 호출 → return f(container의 각 요소) 새로운 컨테이너
→ 1:1 mapping 된다
컨테이너 내부의 값을 걸러서 추출
컨테이너 내부의 콘텐츠를 하나로 통합 (이름이 마음에 안든다...)
for 문으로 내부 콘텐츠 통합할 경우와의 차이점은???
let numbers: [Int] = [2,8,15]
//for의 경우
var sum: Int = 0 // 변수로 선언해줘야 한다
for number in numbers {
sum += number
}
print(sum) // 25
//reduce의 경우
let sum: Int = numbers.reduce(0, { (first: Int, second: Int) -> Int in
return first + second
}) // 상수로 선언해줄 수 있다
print(sum) // 25
let optionals = [1, 2, nil, 4, nil, 5]
let result = optionals.compactMap { $0 }
print(result) // [1,2,4,5]
해당 링크를 통해서 왜 compactMap과 flatMap을 나누었는지 알아보자!!