์ ํ์ ์ด์ ๋์ด์ ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ์ด ์๋์๋ค...
-> ํด๋์ค๋ ์ฐธ์กฐ ํ์ ์ด๋ฏ๋ก ์ฐธ์กฐ ์ถ์ ์ ๋น์ฉ์ด ๋ง์ด ๋ฐ์ํ๋ค. ๋น๊ต์ ๋น์ฉ์ด ์ ์ ๊ฐ ํ์ ์ ํ์ฉํ๊ณ ์ถ์ด๋, ์์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ง๋ค ๊ธฐ๋ฅ์ ๋ค์ ๊ตฌํํด ์ค์ผํ๋ค.
-> ํด๋์ค๊ฐ ์์์ ํ ์ ์๋๋ก ์ค๊ณ ๋์ด์์ด๋ ๋ค์ค์์์ ์ง์ํ๋ ์ธ์ด๋ ๋ง์ง ์๋ค. ๋ค์ค์์์ ํ๋์ ์์์ฒด๊ณ์์ ๋ค๋ฅธ ์์์ฒด๊ณ์ ์ํด์๋ ๊ธฐ๋ฅ์ ๋์ด๋ค ์ธ ์ ์๋ค๋ ๋ป.
ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ฅ์ ํ๋กํ ์ฝ์ด๋ผ๋ ๋จ์๋ก ๋ฌถ์ ํํํ๊ณ ์ด๊ธฐ์ ๊ตฌํ์ ํด ๋ ์ ์์ผ๋ ์์์ด๋ผ๋ ํ๊ณ์ ์ ํํผํ๋ค๊ณ ๋ณผ ์ ์๋ค. ์ ์ฝ์์ด ํ์ํ ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ ์ธ ์ ์๋ค!
๋๋์๊ฐ์ class๋ ๋ชจ๋ api์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๋ฐ๋ฉด Protocol์ ์ ์ํ api๋ง ๊ฐ์ ธ์ค๊ฒ ๋๋ค. ์ด๋ ๊ณง ๋ ๊ฐ๋ณ๊ณ ๋ณด์์ฑ ๋๊ฒ ์ฝ๋๋ฅผ ์งค ์ ์์์ ์๋ฏธํ๋ค.
protocol
์ ๋ญ๋ฐ?ํน์ ์ญํ ์ ์ํํ๊ธฐ ์ํ ๋ฉ์๋, ํ๋กํผํฐ, ์ด๋์ ๋ผ์ด์ ๋ฑ์ ์๊ตฌ์ฌํญ์ ์ ์ํ๋ ๊ฒ!
protocol ํ๋กํ ์ฝ ์ด๋ฆ {
์ ์๋ถ
}
protocol Talkable {
// ํ๋กํผํฐ ์๊ตฌ >> ํญ์ var ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
var topic: String { get set } // ์ฝ๊ธฐ ์ฐ๊ธฐ ๋ชจ๋ ๊ฐ๋ฅํ ํ๋กํผํฐ
var language: String { get } // ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ ํ๋กํผํฐ
// ๋ฉ์๋ ์๊ตฌ
func talk()
// ์ด๋์
๋ผ์ด์ ์๊ตฌ
init(topic: String, language: String)
}
protocol ํ๋กํ ์ฝ ์ด๋ฆ: ๋ถ๋ชจ ํ๋กํ ์ฝ ์ด๋ฆ ๋ชฉ๋ก {
์ ์๋ถ
}
protocol Talkable {
var topic: String { get set }
func talk(to: Self)
}
struct Person: Talkable {
var topic: String
var name: String
func talk(to: Person) {
print("\(topic)์ ๋ํด \(to.name)์๊ฒ ์ด์ผ๊ธฐํฉ๋๋ค")
}
}
-> ์ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ํ๊บผ๋ฒ์ ๊ตฌํํ๋ค๋ฉด ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ค.
protocol Talkable {
var topic: String { get set }
func talk(to: Self)
}
// ์ต์คํ
์
์ ์ฌ์ฉํ ํ๋กํ ์ฝ ์ด๊ธฐ ๊ตฌํ
extension Talkable {
func talk(to: Self) {
print("\(to)! \(topic)")
}
}
์ปฌ๋ ์ ํ์ ์๋ array, set, dictionary ์ธ ๊ฐ์ง๊ฐ ์๋ค.
//๋น๋ฐฐ์ด์ ์์ฑ
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// someInts is of type [Int] with 0 items.
//array๋ ํํ๋ฐฉ๋ฒ์ด ๋ค์ํ๋ค.
//์๋๊ฐ ๋ค ๊ฐ์ ํํ์ด๋ค.
//var someInts: Array<Int> = Array<Int>()
// var someInts: Array<Int> = [Int]()
// var someInts: Array<Int> = []
// var someInts: [Int] = Array<Int>()
// var someInts: [Int] = [Int]()
// var someInts: [Int] = []
// var someInts = [Int]()
//array์ ํ์ฉ
someInts.append(1)
someInts.append(100)
// Int ํ์
์ด ์๋๋ฏ๋ก Array์ ์ถ๊ฐํ ์ ์์ต๋๋ค
//someInts.append(101.1)
print(someInts) // [1, 100]
// ๋ฉค๋ฒ ํฌํจ ์ฌ๋ถ ํ์ธ
print(someInts.contains(100)) // true
print(someInts.contains(99)) // false
// ๋ฉค๋ฒ ๊ต์ฒด
someInts[0] = 99
// ๋ฉค๋ฒ ์ญ์
someInts.remove(at: 0)
someInts.removeLast()
someInts.removeAll()
// ๋ฉค๋ฒ ์ ํ์ธ
print(someInts.count)
// ์ธ๋ฑ์ค๋ฅผ ๋ฒ์ด๋ ์ ๊ทผํ๋ ค๋ฉด ์ต์
์
๋ฐํ์ ์ค๋ฅ๋ฐ์
//someInts[0]
let immutableArray = [1, 2, 3]
// ์์ ์ด ๋ถ๊ฐ๋ฅํ Array์ด๋ฏ๋ก ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค
//immutableArray.append(4)
//immutableArray.removeAll()
Table view์์ ์ค์ํ ํ๋กํ ์ฝ์ด ๋๋ DataSource & Delegate
Delegate๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ํ๋์ ๊ฐ์ฒด๊ฐ ๋ชจ๋ ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ์ฒ๋ฆฌ ํด์ผ ํ ์ผ ์ค ์ผ๋ถ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋๊ธฐ๋ ๊ฒ์ ๋ป ํฉ๋๋ค. ์ฝ๊ฒ ๋งํด์ ์ฐ๋ฆฌ๊ฐ ํด์ผํ ์ผ์ ๋์ ํด์ ํด์ฃผ๋ ๋๋์ ๋๋ค.
TableView์ ์๊ฐ์ ์ธ ๋ถ๋ถ ์์ , ํ์ ์ ํ ๊ด๋ฆฌ, ์ก์ธ์๋ฆฌ๋ทฐ ์ง์ ๊ทธ๋ฆฌ๊ณ ํ ์ด๋ธ๋ทฐ์ ๊ฐ๋ณ ํ ํธ์ง์ ๋์์ค๋๋ค.
์๋ฅผ๋ค๋ฉด 1ํ์ ๋์ด๋ ์ผ๋ง์ธ์ง, 3ํ์ ์ ํํ๋ฉด ๋ฌด์์ ํ๋์ง, 3ํ์ ์ผ๋ง๋ ๋ค์ฌ์ฐ๋ฉด ๋๋์ง ๊ฐ์ ๋ชจ์๊ณผ ๋์์ ๊ด๋ฆฌํ๋ค.
Datasource๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ Delegate๋ก, ํ ์ด๋ธ๋ทฐ์ ์๊ฐ์ ๋ชจ์์ ๋ํ ์ต์ํ์ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. Delegate์ ๋น์ทํ๊ฒ ์ฒ๋ฆฌ ํด์ผ ํ ์ผ ์ค ์ผ๋ถ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋๊ฒจ์ ์์ ์ ๋์ ํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
TableView ๊ฐ์ฒด์ ์น์ ์ ์์ ํ์ ์๋ฅผ ์๋ ค์ฃผ๋ฉฐ, ํ์ ์ฝ์ , ์ญ์ ๋ฐ ์ฌ์ ๋ ฌํ๋ ๊ธฐ๋ฅ์ ์ ํ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
์๋ฅผ๋ค๋ฉด ์ด ์น์ ์ด ๋ช๊ฐ์ธ์ง, 4ํ์ ์ด๋ค ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์์ง, 1์น์ ํ์ดํ์ ๋ฌด์์ธ์ง์ ๊ฐ์ ๊ฒ์ ๊ด๋ฆฌํ๋ค.
๐ ฐ๏ธ table view๋ก ์ด๋ฃจ์ด์ ธ ์์ ๊ฒ! ์ด์ ๋ ํ ์ด๋ธ๋ทฐ์ ์น์ ๊ณผ ๋ฐ์ดํฐ์ ํํ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ.
๐ ฐ๏ธ NotificationCenter๋ฅผ ํตํด ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ตฌ์กฐ์ฒด๋ค. ์ต์ ๋ฒ๋ค์๊ฒ ์ ๋ฌ๋๋ ๊ตฌ์กฐ์ฒด๋ก ์ ๋ณด๊ฐ ๋ด๊ฒจ์๊ณ , ํด๋น ์๋ฆผ์ ๋ฑ๋กํ ์ต์ ๋ฒ์๊ฒ๋ง ์ ๋ฌ๋๋ค. ๊ตฌ์กฐ์ฒด๋ ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์๋ค.
var name: Notification.Name
var object: Any?
userInfo: [AnyHashable : Any]?
๐ ฐ๏ธ NotificationCenter๋ ์ธ์ ์ฌ์ฉํด์ผํ ๊น?