Session 408
๐ Protocol-Oriented Programming in Swift - WWDC 2015 - Videos - Apple Developer
OOP๋ฅผ ๊ทธ์ผฌํ๋ Crusty๋ฅผ ์ค๋์ํค๋ค ๋ณธ์ธ์ด ์ค๋ ๋นํ๋ ๋ด์ฉ
OOP๊ฐ ์งฑ์ด์ผ ํด๋์ค๊ฐ ์งฑ์ด์ผ
- ๊ด๋ จ ๋ฐ์ดํฐ๋ค๊ณผ ์ฐ์ฐ์๋ค์ ๊ทธ๋ฃน์ํฌ ์ ์๋ค โ ์บก์ํ
- ์ธ๋ถ๋ก๋ถํฐ ์ฝ๋ ๋ด๋ถ์ ๊ฐ๊ฐ์ ๋ฒฝ์ ์ธ์ธ ์ ์๋ค โ ์ ๊ทผ ์ ์ด
- ์๋์ฐ, ์ปค๋ฎค๋์ผ์ด์ ์ฑ๋ ๊ฐ์ ๊ด๋ จ ์์ด๋์ด๋ฅผ ๋ํ ํ ์ ์๋ค โ ์ถ์ํ
- ์ถฉ๋์ ๋ฐฉ์งํด์ฃผ๋ ๋ค์์คํ์ด์ค๋ฅผ ์ ๊ณต ํด ์ค๋ค
- ์ด๋ฉ์ด์งํ ํํ ๋ฌธ๋ฒ๋ค์ด ์๋ค
- ํ์ฅ์ฑ์ด ์๋ค
์๋์ผ Type์ด ์งฑ์ด์ผ ์ด๊ฑฐ ๋ค Struct๋ enum์ผ๋ก ํ ์ ์์ด
๋ง์ Swift ์์ ์ด๋ฆ์ ๋ถ์ผ ์ ์๋ ์ด๋ค ํ์ ์ด๋ 1๊ธ ๊ฐ์ฒด์ผ(first class citizen) ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ์ฅ์ ๋ค์ ๋ค ๊ฐ์ง๊ณ ์์ด
๊ผญ ํด๋์ค๋ง ํ ์ ์๋ ํต์ฌ ๊ธฐ๋ฅ์ ์๊ฐํด ๋ดค์ด
- ์ํผํด๋์ค๋ ๋ณต์กํ ๋ก์ง์ ์ค์ง์ ์ธ ๋ฉ์๋๋ฅผ ์ ์ ํ ์ ์๊ณ ์๋ธํด๋์ค์์๋ ์ํผํด๋์ค์ ์ํด ๋ชจ๋ ์์ ์ด ์๋ฃ๋๋ค. ์์๋ง ํ์ ๋ฟ์ธ๋ฐ~
- ์ง์ง ๋ง๋ฒ์ ์๋ธํด๋์ค๊ฐ override ํ ๋ ์๊ธฐ์ง. ์ด๋ฐ ์ปค์คํฐ๋ง์ด์ง ํ ๊ฒ์ด ์์ํ ๊ตฌํ๋ค๊ณผ ํจ๊ป ๋์ธ๋ค. ์ด๊ฒ์ ๋ณต์กํ ๋ก์ง๋ค์ ์ฌ์ฌ์ฉ ํ ์ ์๋ค. ๊ฐ๋ฐฉ๋ ์ ์ฐ์ฑ, ๋ค์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค
Crusty: ๋ Struct๋ก ์ปค์คํฐ๋ง์ด์ง ๋งจ๋ ํด. ๊ทธ๋ ํด๋์ค ๊ฐ๋ ฅํ์ง๋ง ๋น์ฉ์ ๋ํด ์๊ธฐํด๋ณด์
-
Implicit Sharing
๋๋ฌด ๋ง์ ๋ณต์ฌ๊ฐ ์๊ธด๋ค. ์ฝ๋๋ฅผ ๋๋ฆฌ๊ฒ ํ๋ค. ๋๊ธฐํ ๋ฌธ์ ๊ฐ ์๊ณ . ์ค๋ ๋๊ฐ ๋ณํ๊ธฐ ์ฌ์ด ์ํ๋ค์ ๊ณต์ ํ๊ณ ์์ด์ lock์ ํด์ค์ผ ๋๋ค. ์ด lock์ด ์ฝ๋๋ฅผ ๋ ๋๋ฆฌ๊ฒ ํ๋ค. ๋ฐ๋๋ฝ์ด ์๊ธธ ์ ์๋ค. ๋ณต์กํ๋ค
์ด ๋ชจ๋ ์ํฅ๋ค์ด ๊ฒฐ๊ตญ ๋ฒ๊ทธ ๊ฐ ๋๋ค.
โ ํ์ง๋ง! Swift Collection๋ค์ ๋ชจ๋ Value ํ์ ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฉ์ด ๋์ง ์๋๋ค!
-
Inheritance All Up In Your Business ์์์ ํ๋๋ง ๋ฐ์ ์ ์์ด. ํด๋์ค๋ฅผ ์ ์ ํ ๋ ๊ฒฐ์ ํด์ผ ๋์์ ๋์ค์ extension ํ ์ ์์์. ์ํผํด๋์ค์ ์ ์ฅ ํ๋กํผํฐ๋ค์ด ์๋ค๋ฉด ๊ทธ๋ฅ ๋ฌด์กฐ๊ฑด ๋ฐ์ ๋๋ ค์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐํ ํด์ค์ผ ํ๋ค. ๋ฉ์๋๋ค์ด ์ด๋ค์์ผ๋ก override๋๊ณ ์ฒด์ด๋ ๋ ์ง ์ ์ ์๋ค
โ ๊ทธ๋์ Delegate ํจํด์ ์ด๋ค
- Lost Type Relationships ํด๋์ค๋ฅผ ์ถ์ํ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์๊ธฐ๋ ๋ฌธ์ ๋ค
๊ทธ๋์ ๋ ๋์ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ด ํ์ํด โ Swift Protocol
Swift Is a Protocol-Oriented Programming Language
protocol Ordered {
func precedes(other: Self) -> Bool
}
struct Number : Ordered {
var value: Double = 0
func precedes(other: Number) -> Bool {
return self.value < other.value
}
}
func binarySearch<T : Ordered>(sortedKeys: [T], forKey k: T) -> Int { var lo = 0
var hi = sortedKeys.count
while hi > lo {
let mid = lo + (hi - lo) / 2
if sortedKeys[mid].precedes(k) { lo = mid + 1 } else { hi = mid }
}
return lo
}
protocol Renderer {
func moveTo(p: CGPoint)
func lineTo(p: CGPoint)
func circleAt(center: CGPoint, radius: CGFloat)
func arcAt(
center: CGPoint, radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat)
}
extension Renderer {
func circleAt(center: CGPoint, radius: CGFloat) { ... }
func rectangleAt(edges: CGRect) { ... }
}
- ์์์ ๊ณต์ (Implicit Sharing)์ด ํ์ํ ๋
- ์์คํ (Cocoa, Cocoa Touch)๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๊ณ , ์ํผํด๋์ค๋ฅผ ์ ๊ณตํ๊ณ ์๋ธํด๋์ฑ์ ํด์ผ๋๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ผ๋ผ.
- Protocols > Superclasses
- Protocol extensions = magic(almost)
- Be like Crusty