์ง๋ ๊ธ๊ณผ ์ด์ด์ง๋ ๋งฅ๋ฝ์ด๋ค.
์ด๊ธฐํ ์์ ์์ ๋ณผ ์ ์๋ init๊ณผ required init?์ด ๋ฌด์์ธ์ง ์์๋ณด์.
๐ https://dkswlgus0314.tistory.com/236
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๋ฅผ ๋ก๋ํ ๋ ์ฌ์ฉ๋๋ค.
์ด ๋ฉ์๋๋ ์ฃผ๋ก ์ฝ๋๋ก ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ด๊ธฐํํ ๋ NIB ํ์ผ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ ํ์๊ฐ ์์ ๋ ์ฌ์ฉ๋๋ค.
let myViewController = MyViewController(nibName: "MyCustomView", bundle: nil)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
์ด ์ฝ๋๋ ์ธํฐํ์ด์ค ๋น๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ํ๋ก๊ทธ๋จ์ ์ผ๋ก ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ค.
๋ง์ฝ ์ธํฐํ์ด์ค ๋น๋์์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋๋ก ์์ฑ๋์ด ์๋ค.
โ NSCoding ํ๋กํ ์ฝ
NSCoding ํ๋กํ ์ฝ์ ๊ฐ์ฒด๋ฅผ ์ธ์ฝ๋ฉํ๊ณ ๋์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
์ฃผ๋ก ๊ฐ์ฒด๋ฅผ ์์นด์ด๋ธ(archive)ํ๊ฑฐ๋ ์ ์ฅ(storage)ํ ๋ ์ฌ์ฉ๋๋ค.
NSCoding ํ๋กํ ์ฝ์ ์ค์ํ๋ ํด๋์ค๋ ๋ ๊ฐ์ง ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
์ด ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ๊ฐ์ฒด๋ฅผ ํ์ผ์ด๋ 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 ํ๋กํ ์ฝ์ ์ค์ํ์ฌ ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉํ ์ ์๊ฒ ํ๋ค.