ํ๋กํ ์ฝ ์ข ๋ ์ ์ฌ์ฉํ๊ธฐ
OOP์ ๋ํด ๊ณต๋ถํ๋ค๋ณด๋ Swift๋ฅผ ํตํ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์์ ํ๋กํ ์ฝ์ด ๋งค์ฐ ์ค์ํ ์ญํ ์ ํ๋ค๋ ๊ฑธ ์๊ฒ ๋์๊ณ ํ๋กํ ์ฝ์ ์ ๋ง ์ ์ฌ์ฉํ์๋ ๋ถ๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ.. ์์ฆ POP์ ๋ ๊ด์ฌ์ด ๋ง์์ง๊ณ ํ๋กํ ์ฝ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ด๋ ..
๊ทธ๋์! ์์น์์ ์ ๋ง ๊ฐ๋จํ ์ฝ์ ํ๋ก๊ทธ๋จ์ ๊ณผ์ ๋ก ๊ตฌํํ๊ฒ ๋์๋๋ฐ, ์ฌ๊ธฐ์๋ ๊ณตํต๋ ๋ถ๋ถ์ ๋ฌถ์ด ๊ฐ์ฒด๋ฅผ ์ถ์ํํ๊ณ ๋คํ์ฑ์ ๊ตฌํํด ์ต๋ํ ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ฅผ ํ๊ธฐ ์ํดํ๋กํ ์ฝ์ ์ฌ์ฉํด๋ณด์์ต๋๋น..
PR์ ๋ ๋ ธ์ง๋ง ๊ทผ๋ฐ ๋ญ๊ฐ ๋๋ ๋ฌถ์ ์ ์์ ๊ฒ ๊ฐ์ .. ํ๋กํ ์ฝ ๋ ์ ํ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ ..
์ด๋ฐ ์๊ฐ์ ํ๋กํ ์ฝ์ ์ข ๋ ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์ฐพ์๋ณด๊ฒ ๋์๋ค!
ํ์ํ ๋ถ๋ถ์ ๋ํด ์์นํด์ ์ฐพ์๋ณธ ์ ๋ณด + ์์ ์ ํ๋ผ๊ฐ protocol extension์ ๋ํด ์ ๋ฆฌํด์ ๊ณต์ ํด์ค ์๋ฃ๋ฅผ ์ฐธ๊ณ ํด์ ์ ๋ฆฌํด๋ณด๊ณ
๋ฆฌํฉํ ๋ง๊น์ง ํด๋ณด๊ฒ ์! (๋ก์คํฌ ํ๋ผ)
associatedtype
associatedtype์ ํ๋ง๋๋ก ํ๋กํ ์ฝ์์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ! ์ด๋ผ๊ณ ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
์ ๋ค๋ฆญ์ด๋? ํ์ ์ ์ ํ์ ๋์ง ์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ Swift ๊ธฐ๋ฅ์ผ๋ก, ํ ๋ง๋๋ก ๋ฒ์ฉ ํ์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์ค๋ช ํ ์ ์์ ๊ฒ ๊ฐ์๋ฐ, ์์ธํ ๋ด์ฉ์ ์๋ ๊ฒ์๊ธ ์ฐธ๊ณ !
ํ๋กํ ์ฝ์์ ์ ๋ค๋ฆญ์ ์ธ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น ํ๋ค๊ฐ ์ฐพ์๋ณธ๊ฑด๋ฐ, Generic์ ๋ํ ๊ณต์๋ฌธ์์ associatedtype์ ๋ํ ์ค๋ช ์ด ์์์ ใ ใ ใ ..
ํ๋กํ ์ฝ์ ์ ์ํ ๋ ํ๋กํ ์ฝ ์ ์์ ์ผ๋ถ๋ก ํ๋ ์ด์์ ์ฐ๊ด๋ ํ์ ์ ์ ์ธํ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ฐ๊ด ํ์ ์ ํ๋กํ ์ฝ์ ์ผ๋ถ๋ก ์ฌ์ฉ๋๋ ์ ํ์ placeholder ์ด๋ฆ์ ์ ๊ณตํฉ๋๋ค. ํด๋น ์ฐ๊ด ํ์ ์ ์ฌ์ฉํ ์ค์ ํ์ ์ ํ๋กํ ์ฝ์ด ์ฑํ๋ ๋๊น์ง ์ง์ ๋์ง ์์ต๋๋ค. associatedtype ์ด๋ผ๋ ํค์๋๋ก ์ฐ๊ด ํ์ ์ ์ง์ ํ ์ ์์ต๋๋ค.
protocol Playable {
associatedtype GameType
func validateUserInput(_ input: String?) throws -> GameType
func judgeGame(user: GameType, computer: GameType?, turn: PlayerType) -> GameResultType
func showMessage(_ messageType: GameResultType, _ turn: PlayerType)
func playGame(_ result: GameResultType) -> GameResultType
}
ํ๋์ ํ๋ก์ ํธ์์ ๊ฐ์๋ฐ์๋ณด ๊ฒ์๊ณผ ๋ฌต์ฐ๋น ๊ฒ์ ์ด๋ ๊ฒ ๋ ๊ฐ์ง ๊ฒ์์ ๊ตฌํํ๋๋ฐ, 1~3 ์ซ์๊ฐ ์๋ฏธํ๋ ๊ฒ์ด ๊ฐ์(1)๋ฐ์(2)๋ณด(3)๋ ๋ฌต(1)์ฐ(2)๋น (3) ๊ฒ์ ๊ฐ๊ฐ์์ ๋ฌ๋ผ์(ํน..๋ฐ..์..)
@frozen
enum RockPaperScissorsType: Int {
case none = 0
case scissors = 1
case rock = 2
case paper = 3
func getAdvancedType() -> RockPaperScissorsType {
switch self {
case .none:
return .none
case .scissors:
return .rock
case .rock:
return .scissors
case .paper:
return .paper
}
}
}
์ด๋ ๊ฒ ๋ฌต์ฐ๋น ๊ฒ์์์์ ์ซ์๋ฅผ ๊ฐ์๋ฐ์๋ณด์์ ์ฌ์ฉํ๋ ์ซ์๋ก ๋ณํํด์ฃผ๋ ๋ฉ์๋๋ฅผ ์ ์ํด์คฌ์์.. (๊ฐ์ enum ํ์ ์ ์จ์ฃผ๋ ค๊ณ )
๊ทผ๋ฐ associatedtype์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ ๊ฒ ํ์ ๋ณํํด์ฃผ๋ ํจ์๋ ํ์ ์๊ณ , ๋ ์ง๊ด์ ์ธ ์ฝ๋๊ฐ ๋ ๊ฒ ๊ฐ์!! (enum์ ํ๋ ๋ ์ ์ํด์ฃผ์ด์ผ ํ๊ฒ ์ง๋ง)
protocol extension
ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ๋ชฉ์ ์ค ํฐ ๋ถ๋ถ์ ์ฐจ์งํ๋ ๊ฒ์ด ์ฌ์ค ์ค๋ณต๋ ์ฝ๋๋ฅผ ํผํ๊ธฐ ์ํด์! ์ผ ๊ฒ ๊ฐ์๋ฐ,
์ฌ๋ฌ ํด๋์ค(or ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ)์์ ํน์ ๋ฉ์๋๋ฅผ ๋์ผํ๊ฒ ๊ตฌํํด์ ์ฌ์ฉํด์ผ ํ ๋๊ฐ ์์
๊ตฌํ๋ถ๊น์ง ๋๊ฐ์ ๋ฉ์๋๋ฅผ ํ๋กํ ์ฝ์ ์ฑํํ๋ ๋ชจ๋ ํด๋์ค(or ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ)๋ง๋ค ๊ณตํต๋ ๊ธฐ๋ฅ์ ๋ค ๊ตฌํํด์ค์ผ ํ ๊น? No...
protocol extension์ ํ์ฉํ๋ฉด ํ๋กํ ์ฝ์์๋ ๊ธฐ๋ณธ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค!!!
์ ๋ฆฌ: ํ๋กํ ์ฝ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํ์ ์ ๊ณตํด์ฃผ๊ณ ์ถ์ ๊ฒฝ์ฐ, extension์ ํตํด์ ์ ๊ณตํ ์ ์์
์์ vs. protocol extension
๋๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ๋ฌ ํด๋์ค์์ ์ฌ์ฉํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ๋ฉด ์์์ด ์๊ฐ๋จ
๊ทธ๋ผ ์์์ ํ์ฉํ๋ฉด ๋์์?? ๋ผ๋ ์๋ฌธ์ด ๋ค ์ ์๋ค.
์ด๋ค ๊ฒฝ์ฐ์ ํ๋กํ ์ฝ ์ต์คํ ์ ์ ํ์ฉํ๋ฉด ์ข์๊น???
์์์ ํ๊ณ
- ํด๋์ค์์๋ง ์์ ๊ฐ๋ฅ
- ๋จ์ผ ์์๋ง ๊ฐ๋ฅ
๊ธฐ์กด์ ์์์์ ์ด๋ฌํ ํ๊ณ๋ฅผ ๋๊ผ๋ค..
๋ง์ฝ ํด๋์ค๊ฐ ์๋ ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ์์ ์ค๋ณต๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ณ ์ถ๋ค. ํน์ ํ ํด๋์ค์์ ์ฌ๋ฌ ํ์ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค.
ํ ๋ ํ๋กํ ์ฝ ์ต์คํ ์ ์ ํ์ฉํ๋ฉด ์ข์ ๋ฏ!!!
์์, ํ๋กํ ์ฝ ์ต์คํ ์ ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ ์ ํํด์ ์ฌ์ฉํ์.
// Runable ํ๋กํ ์ฝ
protocol Runable {
func run()
}
extension Runable {
func run() {
print("run!!!!!")
}
}
// Jumpable ํ๋กํ ์ฝ
protocol Jumpable {
func jump()
}
extension Jumpable {
func jump() {
print("jump!!!!!")
}
}
// Frog ํด๋์ค์์ ๋ ๊ฐ์ ํ๋กํ ์ฝ ์ฑํ
class Frog: Runable, Jumpable { }
let frog = Frog()
frog.run()
frog.jump()
์์ ์ฝ๋์ ๊ฐ์ด protocol extension ์์์ ํ๋กํ ์ฝ์ ์ ์ํด๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ํด๋์ค์์๋ ์ฑํํ ํ๋กํ ์ฝ์ ๋ฉ์๋๋ฅผ ๋ค์ ๊ตฌํํ ํ์์์ด ํธ์ถํด์ ๋ฐ๋ก ํด๋น ๋ฉ์๋์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
class Frog: Runable, Jumpable {
func run() {
print("์ฐ๋ค๋ค๋ค๋ค๋คใ
")
}
}
let frog = Frog()
frog.run()
frog.jump()
๋ง์ฝ, ํด๋์ค ๋ด์์ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ค๋ฉด extension์ ๊ตฌํ๋ ๊ธฐ๋ณธ ์ ๊ณต๋๋ ๋ฉ์๋ ๋ณด๋ค, ์ง์ ๊ตฌํํ ๋ฉ์๋์ ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ๊ตฌํ ๋ฉ์๋๊ฐ ์๋๋ผ ์ฌ์ ์ํ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค!!
ํน์ ํด๋์ค์์๋ง ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ๋๋ก ํ๊ณ ์ถ๋ค๋ฉด extension์ ํ์ฉํ ๊ธฐ๋ณธ ๊ตฌํ + ์ฌ์ ์๋ฅผ ํ์ฉํ๋ฉด ์ข๊ฒ ๋ค!
where clause
where์ ํตํด์ ๊ธฐ๋ณธ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ์ ํ์ ๋ ์ ์๋ค.
extension Presentable where Self: UIView {
func show(withMovement: CGFloat, withDuration: CGFloat) {
self.snp.updateConstraints {
$0.bottom.equalToSuperview().inset(withMovement)
}
guard let superview else { fatalError("Has not superview") }
UIView.animate(withDuration: withDuration, animations: superview.layoutIfNeeded)
}
}
์์ ์ฝ๋์ ๊ฐ์ด UIView ์ ๋ํด์๋ง show() ๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ฒ ๋ค !! ์ด๋ ๊ฒ ์ ํํ ์ ์๋ ๊ฒ
๋ง์ฝ UIView ํ์ ์ด ์๋ ๋ค๋ฅธ ํด๋์ค์์ ํ๋กํ ์ฝ ์ฑํ ํ show๋ฅผ ํธ์ถํ๋ ค๊ณ ํ๋ฉด show() ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ผ!! ๋ผ๋ ์๋ฌ ๋ฉ์์ง๊ฐ ๋จ๊ฒ ๋จ
๋๋ ํ๋กํ ์ฝ ์ ์ฐ๊ณ ์ถ๋น...ใ
'๐ ๊ธฐ๋ก > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] 20231130 (2) | 2023.11.30 |
---|---|
[TIL] 20231129 (1) | 2023.11.29 |
[TIL] 20231124 (1) | 2023.11.25 |
[TIL] 20231123 (1) | 2023.11.23 |
[TIL] 20231122 (0) | 2023.11.22 |