

이전 화면에 코드'만' 작성
@IBAction func unwindToCalendar(_ segue: UIStoryboardSegue) {
}
다음 화면에서 버튼 exit 연결 후 함수 선택

| UserDefaults | DataBase | 
|---|---|
| 단일 데이터 값 (경량) | 유사한 대량 데이터 값 (중량) | 
| 자동 로그인 여부, 알림 수신 여부, 인앱 결제 여부 이메일, 닉네임, 성별 등 간단한 사용자 기본 설정 앱 테마, 앱 첫 실행, 팝업 다시 보지 않기 등  | 제목, 메모, 별점, 배우, 줄거리 등 영화 관리 데이터 감정, 내용, 위치, 날짜 등 작성한 일기 데이터 상대방과 주고받은 채팅 내역 데이터  | 
| Apple에서 제공해주는 key-value 형태의 기본 저장소 | Core data (by Apple) Realm, SQLite  | 
// property wrapper 사용
@propertyWrapper
struct TwelveOrLess {
	private var number: Int
	init() {
		self.number = 0
	}
	var wrappedValue: Int {  // wrappedValue 네이밍 필수
		get { return number }
		set { number = min(newValue, 12) }
	}
}
struct SmallRectangle {
	@TwelveOrLess var height: Int
	@TwelveOrLess var width: Int
}
var rectangle = SmallRectangle()
print(rectangle.height)  // 0
rectangle.height = 10
print(rectangle.height)  // 10
rectangler.height = 24
print(rectangle.height)  // 12
// 기존 코드
struct SmallRectangle {
	var height: Int {
		get { self.height }
		set { self.height = min(newValue, 12) }
	}
	var width: Int {
		get { self.width }
		set { self.width = min(newValue, 12) }
	}
}
// projected Value
@propertyWrapper
struct SmallNumber {
	private var number = 0
	var projectedValue = false  // projectedValue 네이밍 사용 필수
	var wrappedValue: Int {
		get { return number }
		set {
					if newValue > 12 {
						number = 12
						projectedValue = true  // 값이 조정되었다는 뜻으로 사용
					else {
						number = newValue
						projectedValue = false
					}
		}
	}
	init() {self.number = 0} 
}
struct SomeStruct {
	@SmallNumber var num: Int
}
var s = SomeStruct()
s.num = 4
print(s.num)	// wrappedValue 접근
print(s.$num)	// projectedValue 접근
TableView = Section + Cell
TableView
Section
Cell
dequeReusableCellsection의 개수 (디폴트 : 1)
override func numberOfSections(in tableView: UITableView) -> Int {
        return 2
}
section의 헤더 이름 (디폴트 : nil)
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {        
        return (section == 0) ? "첫 번째 섹션" : "첫 번째가 아닌 섹션"
}
section의 cell 개수 (디폴트 : 1)
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return (section == 0) ? studyList.count : anotherList.count
}
section의 cell 데이터 및 디자인 처리
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "todoCell")!
        // [0, 0] 좌표에서 앞 : section / 뒤 : row    라고 생각하면 될 듯
        if (indexPath.section == 0) {
            cell.textLabel?.text = studyList[indexPath.row]
        }
        else {
            cell.textLabel?.text = anotherList[indexPath.row]
        }
        return cell
}
section의 cell 높이
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.row == 0 {
            return 90
        } else if indexPath.row == 1 {
            return 150
        }
        return 50
}
// 매번(셀마다) 위 함수를 실행시키는 건 좀 비효율적이고,
// viewDidLoad에서 모든 셀의 높이를 통일시키는 방법이 있다
// 모든 셀이 같은 높이를 가지면 아래 방식이 더 낫다
override func viewDidLoad() {
        super.viewDidLoad()
        tableView.rowHeight = 60
}
화면 새로 로드
tableView.reloadDate()
셀 선택 시
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("select", indexPath)
    //tableView.deselectRow(at: indexPath, animated: true)
}