์ง๋ ๊ธ๊ณผ ์ด์ด์ง๋ ๋งฅ๋ฝ์ด๋ค.
์ด๊ธฐํ ์์ ์์ ๋ณผ ์ ์๋ init๊ณผ required init?์ด ๋ฌด์์ธ์ง ์์๋ณด์.
๐ https://dkswlgus0314.tistory.com/236
๐ 1. init๊ณผ required init? ์ ๋ํด์
๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์ init
- ๊ธฐ๋ฅ: ์ฌ์ฉ์ ์ ์ ์ด๋์ ๋ผ์ด์ ๋ก, ํด๋์ค๊ฐ ์ธ์คํด์คํ๋ ๋ ํ์ํ ์ด๊ธฐํ ์์ ์ ์ํํ๋ค.
- ์ฌ์ฉ ์: ์ฃผ๋ก ํด๋์ค ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ์ด๊ธฐ ์ํ๋ฅผ ์ค์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
- ํ์ํ ์์ฑ๋ค์ ์ธ๋ถ์์ ๋ฐ์ ์ด๊ธฐํํ ์ ์๋ค.
init(coreDataRepository: CoreDataRepository, mode: PhoneBookMode) {
self.coreDataRepository = coreDataRepository
self.mode = mode
super.init(nibName: nil, bundle: nil)
}
์ฌ๊ธฐ์ coreDataRepository์ mode๋ ์ธ๋ถ์์ ์ ๊ณต๋ ๊ฐ์ ์ฌ์ฉํ์ฌ ์ด๊ธฐํ๋๋ค.
๋ํ, UIViewController์ ์ด๊ธฐํ ๋ฉ์๋ super.init(nibName:bundle:)์ ํธ์ถํ์ฌ ์์ ํด๋์ค์ ์ด๊ธฐํ๋ ์ํํ๋ค.
โ ์ธ๋ถ์์ ๊ฐ์ด ์ ๊ณต๋๋ ๋ฐฉ์
ํด๋์ค์ ์ด๋์ ๋ผ์ด์ ์์ ์ธ๋ถ ๊ฐ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ธ๋ถ์์ ๊ฐ์ ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
์๋ฅผ ๋ค์ด, PhoneBookViewController์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ coreDataRepository์ mode ๊ฐ์ ์ธ๋ถ์์ ์ ๋ฌํ ์ ์๋ค.
let coreDataRepo = CoreDataRepository()
let phoneBookMode = PhoneBookMode()
let phoneBookVC = PhoneBookViewController(coreDataRepository: coreDataRepo, mode: phoneBookMode)
์ฌ๊ธฐ์ coreDataRepo์ phoneBookMode๊ฐ PhoneBookViewController์ ์ด๋์ ๋ผ์ด์ ์ ์ ๋ฌ๋๋ฉฐ,
self.coreDataRepository์ self.mode ์์ฑ์ผ๋ก ์ด๊ธฐํ๋๋ค.
์ด๋ ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ ์ผํ์ผ๋ก, ํด๋์ค ์ธ๋ถ์์ ํ์ํ ์์กด์ฑ์ ์ ๊ณตํ๋ ๋ฐฉ์์ด๋ค.
โ nibName: ์ bundle:์ ์๋ฏธ
nibName:bundle:์ UIViewController์ ์ด๊ธฐํ ๋ฉ์๋ ์ค ํ๋๋ก, NIB ํ์ผ ๋๋ XIB ํ์ผ์ ํตํด
๋ทฐ ์ปจํธ๋กค๋ฌ์ UI๋ฅผ ๋ก๋ํ ๋ ์ฌ์ฉ๋๋ค.
- nibName:
NIB ํ์ผ(XIB ํ์ผ)์ ์ด๋ฆ์ ์ง์ ํ๋ค.
NIB ํ์ผ์ Interface Builder์์ ์์ฑ๋ ํ์ผ๋ก, ๋ทฐ ์ปจํธ๋กค๋ฌ์ UI๋ฅผ ์ ์ํ๋ค. - bundle:
NIB ํ์ผ์ด ํฌํจ๋ ๋ฒ๋ค(Bundle)์ ์ง์ ํ๋ค. nil๋ก ์ค์ ํ๋ฉด ๊ธฐ๋ณธ ๋ฒ๋ค์ ์ฌ์ฉํ๋ค.
์ด ๋ฉ์๋๋ ์ฃผ๋ก ์ฝ๋๋ก ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ด๊ธฐํํ ๋ NIB ํ์ผ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ ํ์๊ฐ ์์ ๋ ์ฌ์ฉ๋๋ค.
let myViewController = MyViewController(nibName: "MyCustomView", bundle: nil)
๐ ํ์ ์ด๋์ ๋ผ์ด์ required init?
- ๊ธฐ๋ฅ: ์๋ธํด๋์ค์์ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ง์ ํ ๋ ์ฌ์ฉํ๋ค. ํ๋กํ ์ฝ์์ ์๊ตฌํ๋ ์ด๋์ ๋ผ์ด์ ๋ฅผ ๊ตฌํํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
- ์ฌ์ฉ ์: ์ฃผ๋ก NSCoding ํ๋กํ ์ฝ์ ์ค์ํ ๋ ์ฌ์ฉ๋๋ค. NSCoding ํ๋กํ ์ฝ์ ์ค์ํ๋ ค๋ฉด init?(coder:) ์ด๋์ ๋ผ์ด์ ๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
์ด ์ฝ๋๋ ์ธํฐํ์ด์ค ๋น๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ํ๋ก๊ทธ๋จ์ ์ผ๋ก ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ค.
๋ง์ฝ ์ธํฐํ์ด์ค ๋น๋์์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋๋ก ์์ฑ๋์ด ์๋ค.
โ NSCoding ํ๋กํ ์ฝ
NSCoding ํ๋กํ ์ฝ์ ๊ฐ์ฒด๋ฅผ ์ธ์ฝ๋ฉํ๊ณ ๋์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
์ฃผ๋ก ๊ฐ์ฒด๋ฅผ ์์นด์ด๋ธ(archive)ํ๊ฑฐ๋ ์ ์ฅ(storage)ํ ๋ ์ฌ์ฉ๋๋ค.
NSCoding ํ๋กํ ์ฝ์ ์ค์ํ๋ ํด๋์ค๋ ๋ ๊ฐ์ง ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
- func encode(with coder: NSCoder): ๊ฐ์ฒด์ ์์ฑ์ ์ธ์ฝ๋ฉํ๋ ๋ฉ์๋.
- init?(coder: NSCoder): ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋์ฝ๋ฉํ๋ ์ด๋์ ๋ผ์ด์ .
์ด ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ๊ฐ์ฒด๋ฅผ ํ์ผ์ด๋ UserDefaults ๋ฑ์ ์ ์ฅํ๊ณ ๋ค์ ๋ก๋ํ ์ ์๊ฒ ๋๋ค.
class MyObject: NSObject, NSCoding {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
required init?(coder: NSCoder) {
guard let name = coder.decodeObject(forKey: "name") as? String else { return nil }
let age = coder.decodeInteger(forKey: "age")
self.name = name
self.age = age
}
func encode(with coder: NSCoder) {
coder.encode(name, forKey: "name")
coder.encode(age, forKey: "age")
}
}
์ด ์ฝ๋๋ MyObject ํด๋์ค๊ฐ NSCoding ํ๋กํ ์ฝ์ ์ค์ํ์ฌ ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉํ ์ ์๊ฒ ํ๋ค.