ํ๋กํผํฐ
์ธ์คํด์ค ํ๋กํผํฐ (ํด๋์ค/๊ตฌ์กฐ์ฒด๋ฅผ ์ด๊ธฐํ๋ฅผ ํด์ผ ํ๋กํผํฐ์ ์ ๊ทผ ๊ฐ๋ฅ)
์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ๋์์ or ์ ์ธ๋ง ํด๋๊ณ ์ธ์คํด์ค ์์ฑ ์ ์ด๊ธฐํ ํด๋ ๋จ!
struct User {
var nickname: String
//์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ๋์์ or ์ ์ธ๋ง ํด๋๊ณ ์ธ์คํด์ค ์์ฑ ์ ์ด๊ธฐํ ํด๋ ๋จ!
//์ธ์คํด์ค ํ๋กํผํฐ + ์ ์ฅ ํ๋กํผํฐ
static var originName: String = "์ง์ง ์ด๋ฆ"
//ํ์
ํ๋กํผํฐ(Meta Type) + ์ ์ฅ ํ๋กํผํฐ
//์ฌ์ฉํ๊ฒ ๋๋ ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ, ์ฑ ์ข
๋ฃ๊น์ง ๋ฉ๋ชจ๋ฆฌ ์ ์ง
//์ง์ฐ ์ ์ฅ ํ๋กํผํฐ(lazy) ์ฒ๋ผ ๋์
}
์ธ์คํด์ค๋ ์ธ์คํด์ค ํ๋กํผํฐ๋ง ์ ๊ทผ ๊ฐ๋ฅ
ํ์ ํ๋กํผํฐ ์ ๊ทผ ๋ถ๊ฐ
ํ์ ์ด๋ฆ์ผ๋ก ์ธ์คํด์ค ํ๋กํผํฐ ์ ๊ทผ๋ถ๊ฐ
ํ์ ํ๋กํผํฐ ์ ๊ทผ ๊ฐ๋ฅ
- ์ธ์คํด์ค ํ๋กํผํฐ ์๋ฌด๋ฆฌ ๋ง์๋ ํ์ ํ๋กํผํฐ๋ ๊ทธ๋๋ก์
- ํ์ง๋ง ํ์ ํ๋กํผํฐ ์ ๊ทผํด์ ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฐ๋
- ํ์ ํ๋กํผํฐ๋ฅผ ์๋ฌด๋ฆฌ ๋ง์ด ์ ์ธํด๋๋ ์ฌ์ฉ ์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ์ง ์์.
์ธ์คํด์ค ํ๋กํผํฐ + ์ฐ์ฐ ํ๋กํผํฐ
struct User {
var nickname: String
static var originName: String = "์ง์ง ์ด๋ฆ"
//์ธ์คํด์ค ํ๋กํผํฐ + ์ฐ์ฐ ํ๋กํผํฐ
//๊ฐ์ ์ด๊ธฐํํ๊ณ ์ ์ฅํ ์ ์๋ ๊ณต๊ฐ์ด ์๊ณ , ๋ค๋ฅธ ์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ ์ฐ์ฐํด์ ๊ฐ์ ์ ์ผ๋ก ๊ฐ์ ์ ๊ณต!
var userIntroduce: String {
get {
return "์ด ์ฌ์ฉ์์ ๋๋ค์์ \(nickname)์ด๊ณ , ์ง์ง ์ด๋ฆ์ \(User.originName)์
๋๋ค."
}
}
}
- ๊ณผ์ ์ movieDescription “๊ฐ๋ด์ผ|๋ฌ๋ํ์|ํ์ ”์ด๋ฐ ๋ฌธ์์ด ์ฐ์ฐ ํ๋กํผํฐ๋ก ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ ์ ์์ → ์คํ๋ทฐ๋ก ๋ถ์ฌ๋์ ๋ถ๋ค์ด ์์๋๋ฐ ์คํ๋ทฐ ์ด ๊ฑฐ๋ ์์ด๊ฑฐ๋ณด๋ค ๋ก๋๊ฐ ๋๋ฆผ. ๋๊ฐ์ด ํ์ ํ ์ ์์ผ๋ฉด ๋ทฐ ๊ฐ์๋ฅผ ์ต๋ํ ์ค์ด๋๊ฒ ์์ดํฐ์ ์ฅ์์๋ ์ข์.
์ฐ์ฐ ํ๋กํผํฐ
struct BMI {
var weight: Double
var height: Double
//์ฐ์ฐ ํ๋กํผํฐ
var BMIResult: String {
get {
let bmiValue = weight / (height * height)
let bmiStatus = bmiValue < 18.5 ? "์ ์ฒด์ค" : "์ ์ ์ด์"
return "๊ณ ๋๋ฐฅ๋์ BMI ์ง์๋ \(bmiValue)๋ก \(bmiStatus)์
๋๋ค."
}
}
}
- ์ฐ์ฐ ํ๋กํผํฐ๊ฐ ์ธ์คํด์ค ํ๋กํผํฐ๋ฉด ์ค๊ดํธ ์์ ์ธ์คํด์ค ํ๋กํผํฐ ๋ฐ์ ๋ชป ์.
- ์ฐ์ฐ ํ๋กํผํฐ๊ฐ get ๋ฐ์ ์์ผ๋ฉด get ์๋ต ๊ฐ๋ฅ
์ฐ์ฐ ํ๋กํผํฐ vs ํจ์์ ๋ฐํ ๊ฐ → ๊ฑฐ์ ๋น์ทํ ์ญํ ์ด๊ธด ํจ.
- ์ฐ์ฐ ํ๋กํผํฐ : ์ ์ฅํ๋กํผํฐ ๋ง์ผ๋ก ๋จ์ํ๊ฒ ์ฐ์ฐ ๊ฐ๋ฅ ํ ์ ๋.
- ํจ์ : ์ข ๋ ๋ณต์กํ ๊ฒ ํ ๋ ๋ง์ด ์ ํธ ๋จ.
Enum: ์ปดํ์ผ
- ์ด๊ธฐํ ๋ถ๊ฐ๋ฅ, ์ธ์คํด์ค ์์ฑ ๋ถ๊ฐ๋ฅ → ์ธ์คํด์ค ํ๋กํผํฐ/์ธ์คํด์ค ๋ฉ์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ!
- ๊ฐํ์
- ํ์ ํ๋กํผํฐ ์ฌ์ฉ ๊ฐ๋ฅ(but ์ปดํ์ผ ํ์ ์ด๋ผ ๋ต์ด ๋ค์ด ์์ด์ผ ํจ.) → ๊ทธ๋ผ rawValue ๋ฃ์ด ์ฃผ๋ ๊ฒ์ด๋ ๋ญ ์ฐจ์ด? rawValue๋ ์ ๋ํฌ ํด์ผ๋์ ๊ฐ์ rawValue๋ฅผ ๋ด์ ์ ์์ด์ case๋ก ๋ฌธ๊ตฌ๋ค์ ๋ํ๋ด๋ค๊ฐ static let์ผ๋ก ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์์
- ๊ฐ์ ๊ฐ์ static let์ ํตํด์ ๋ค๋ฅด๊ฒ ํํ ๊ฐ๋ฅ.
-
์ถ๊ฐ ์กฐ์ฌํ ์ด๊ฑฐํ ํน์ง๊ณผ ์ฅ์
- ์ด๊ฑฐํ์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ ํ์ ์ ์ ์ํ๋ฉด ์ปดํ์ผ ์ค๋ฅ๋ก ์ฐพ์๋ด๋๋ฐ ์ฉ์ด
- ํน์ ์์๋ค์ ์งํฉ
- ๊ด๋ จ ๊ฐ์ ํ๋์ ์ ํ์ผ๋ก ๋ฌถ์ด์ ์ ์ํ ํ์
- ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ ๋์ ์ฝ๋
- ๋ฐฐ์ด์ ๊ฒฝ์ฐ nil๊ฐ์ด ๋ค์ด์๋ ๊ฒฝ์ฐ..๋ฑ๋ฑ..๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ฌ์ง๊ฐ ์์ง๋ง, enum์ ์ด๋ฐ ์ค๋ฅ๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ์ก์์ฃผ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผํ์์ ์๋ฌ๋ฅผ ํ์ธํ ์ ์๋ค.
- struct๋ก enum์ ๊ธฐ๋ฅ์ ์ธ ์์๋ ๋์ํ ์ ์์ง๋ง enum์ ๊ฒฝ์ฐ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ์์๋ก ์ ๊ทผํ ์ ์๋๋ก ๋ง๋ค์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ํด๋จผ์๋ฌ์ ์ฌ์ง๊ฐ ์ค์ด๋ ๋ค.
- stuct์ class๋ก๋ enum ์ญํ ์ ํ ์ ์์ง๋ง enum์ ์ธ์คํด์คํ๊ฐ ํ์ํ์ง ์๊ณ ์ปดํ์ผ ๋น์์๋ ๋ฉค๋ฒ๊ฐ ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ์ค์ด๋ ๋ค.
์ ์ง๋ ค๊ณ ๊ณ ๋ฏผํ๊ณ ์ ์ง๋ ๊ฒ๋ณด๋ค ์ด์ํ๋๋ผ๋ ๋ง ์ง๋๊ฒ ๋์ค์ ์๋์ ์ค๋ ฅ ํฅ์์ ์ค์.
๊ฐ์ ์ค๋ณด์ ์๋ ๋ทฐ์ปจ์ด๋ฉด ์์ ์ฃผ์์ฒ๋ผ ์ ์ฐ๊ณ ๊ทธ๋ฅ storyboard ํธ์ถํด์ ์ ๊ทผ ๊ฐ๋ฅ.
Enum์ผ๋ก ํค๋ ์๋ ํ ์ด๋ธ๋ทฐ ๊น๊ผผํ๊ฒ ๋ง๋ค๊ธฐ
๋ง๋ค ํ๋ฉด
์ด๊ฑฐํ ๊ตฌํ
- ์น์ ๊ฒฝ์ฐ๋ค์ case๋ก ๋๋์ด ์ด๊ฑฐํ ์์ ์ ์ธํด๋ .
- mainOptions ํ๋กํผํฐ: ํค๋์ฉ. ๊ฐ ์น์ ์ผ์ด์ค ํค๋ ๋ฌธ์์ด ๋ฐํ
- subOptions ํ๋กํผํฐ: ์ ํ ์คํธ ์ฉ. ๊ฐ ์น์ ์ผ์ด์ค ํด๋น ๋ฌธ์์ด ๋ฐฐ์ด ๋ฐํ
๋ฆฌํฉํ ๋ง ์ ์ฝ๋
import UIKit
class SettingTableViewController: UITableViewController {
let sectionHeaderList = [(name:"์ ์ฒด ์ค์ ",count:3),(name:"๊ฐ์ธ ์ค์ ",count:3),(name:"๊ธฐํ",count:3)]
let allSettingList = ["๊ณต์ง์ฌํญ","์คํ์ค","๋ฒ์ ์ ๋ณด"]
let personalSettingList = ["๊ฐ์ธ/๋ณด์","์๋ฆผ","์ฑํ
","๋ฉํฐ ํ๋กํ"]
let etcSettingList = ["๊ณ ๊ฐ์ผํฐ/๋์๋ง"]
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return sectionHeaderList.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch(section){
case 0: return allSettingList.count
case 1: return personalSettingList.count
case 2: return etcSettingList.count
default: return sectionHeaderList[section].count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SettingContentsCell", for: indexPath)
switch indexPath.section{
case 0: cell.textLabel?.text = allSettingList[indexPath.row]
case 1: cell.textLabel?.text = personalSettingList[indexPath.row]
case 2: cell.textLabel?.text = etcSettingList[indexPath.row]
default: cell.textLabel?.text = allSettingList[indexPath.row]
}
return cell
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sectionHeaderList[section].name
}
}
๋ฆฌํฉํ ๋ง ํ ์ฝ๋
import UIKit
enum SettingOptions: Int, CaseIterable {
case total, personal, others
var mainOptions: String {
get {
switch self{
case .total: return "์ ์ฒด ์ค์ "
case .personal: return "๊ฐ์ธ ์ค์ "
case .others: return "๊ธฐํ"
}
}
}
var subOptions: [String] {
switch self {
case .total: return ["๊ณต์ง์ฌํญ","์คํ์ค","๋ฒ์ ์ ๋ณด"]
case .personal: return ["๊ฐ์ธ/๋ณด์","์๋ฆผ","์ฑํ
","๋ฉํฐํ๋กํ"]
case .others: return ["๊ณ ๊ฐ์ผํฐ/๋์๋ง"]
}
}
}
class SettingTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func numberOfSections(in tableView: UITableView) -> Int {
return SettingOptions.allCases.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return SettingOptions.allCases[section].subOptions.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: SettingTableViewCell.identifier)!
cell.textLabel?.text = SettingOptions.allCases[indexPath.section].subOptions[indexPath.row]
return cell
}
}
์ ์์ ๋ฒํผ ์ก์ ๋ฐ๊ธฐ (๋ทฐ tag ์ด์ฉํด์ ๊ตฌํํ๊ธฐ)
- ์ด๋ค ๋ฒํผ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ํด tag๊ฐ ๋ฃ์ด ์ค.
- sender ๋งค๊ฐ๋ณ์๋ iOS ๋ด๋ถ์ ๋์ํ์ฌ ๊ฐ์ด ๋ค์ด์ค๋ ๋ถ๋ถ
- ์์์ ์ง์ ํ tag๊ฐ ํ๋ฆฐํธ ํด๋ณด๋ ์ค
- ๋จ์ : ์น์ ์ฌ๋ฌ ๊ฐ์ฌ์ ํ๊ทธ ๊ฒน์น๊ณ ํ๋ฉด ๋ฐ๋ก ๊ด๋ฆฌํด์ฃผ๊ฑฐ๋ ์์์ ์ซ์ ๋ค ์ง์ ํด์ค์ผํจ.
SearchBar
- ์์๋ ์ก์ ์ฐ๊ฒฐ ์๋จ
- ํ์ง๋ง ์์น๋ฐ ์์ ์๋๊ฒ ํ ์คํธํ๋ → ํ ์คํธํ๋ ๊ธฐ๋ฅ ์ด์ฉ ๊ฐ๋ฅ
- addTarget์ผ๋ก ์ก์ ๊ตฌํ ๊ฐ๋ฅ.
- .editingDidEndOnExit : ์ํฐํค ๋๋ฅธ ์ํ
searchbar ๋ด์ฉ ํ ์ด๋ธ๋ทฐ ๋ฐ์ดํฐ ๋ฆฌ์คํธ์ ๋ฃ์ ํ ํ ์ด๋ธ๋ทฐ Reload
didSet
๋ฐ์ดํฐ ๋ฐ๋๋ฉด ๊ณ์ ์คํ ๋๋ ์ฝ๋
ํ ์ด๋ธ ๋ทฐ ์ค์์ดํํด์ ์ง์ฐ๊ฑฐ๋ ๋ด์ฉ ์ถ๊ฐ ๋๊ฑฐ๋ ์ข์์ ๋๋ฅด๊ฑฐ๋ ๋๋๋ง๋ค ํธ์ถ ๋จ.
→ viewcontroller ์ฝ๋ ๋ด์์ ๊ตณ์ด ๋ฐ๋ก tableView.reloadData() ์ ํด์ค๋ ์๋์ผ๋ก ๋ฐ์ ๋จ.
'SeSAC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] TIL_230803 (0) | 2023.08.06 |
---|---|
[iOS] TIL_230802 (0) | 2023.08.05 |
[iOS] TIL_230731 (0) | 2023.08.03 |
[iOS] TIL_230728 (0) | 2023.08.01 |
[iOS] TIL_230727 (0) | 2023.07.31 |