π 1 . νλ‘ν μ½
νλ‘ν μ½μ νΉμ κΈ°λ₯μ΄λ νΉμ±μ ꡬνν λ νμν λ©μλλ νλ‘νΌν°μ μ²μ¬μ§μ μ 곡νλ€.
νλ‘ν μ½μ μ μΈν λλ νλ‘νΌν°λ λ©μλλ₯Ό ꡬ체μ μΈ λ΄μ©μ΄ μκ³ ννλ§ μ 곡νλ€.
ꡬ체μ μΈ λ΄μ©μ μ΄ νλ‘ν μ½μ μ±ννλ ν΄λμ€, ꡬ쑰체, μ΄κ±°ν, extension κ°μ²΄μμ λ΄λΉνλ€.
νλ‘ν μ½μ μ μλ λ©μλμ νλ‘νΌν°λ₯Ό λ°λμ ꡬν νλ€.
protocol Drawable {
var name: String { get } // μ½κΈ° μ μ© νλ‘νΌν°
func draw ()
}
//νλ‘ν μ½ μ±ν
class Circle: Drawable {
var name: String { //κ³μ° νλ‘νΌν°
return "Circle"
}
func draw() {
print("λκ·ΈλΌλ―Έ 그리기") //νλ‘ν μ½ λ©μλ ꡬν
}
}
struct Square: Drawable {
var name: String = "Square" // μ μ₯ νλ‘νΌν°
func draw() {
print("λ€λͺ¨ 그리기") //νλ‘ν μ½ λ©μλ ꡬν
}
}
//νλ‘ν μ½μ μ₯μ : λ€νμ±(Polymorphism) μ 곡
let shapes: [Drawable] = [Circle(), Square()] //Drawable νλ‘ν μ½μ μ€μνλ κ°μ²΄λ€λ‘ ꡬμ±
for shape in shapes {
print("\(shape.name) : ", terminator: "")
shape.draw()
}
//μΆλ ₯
//Circle : λκ·ΈλΌλ―Έ 그리기
//Square : λ€λͺ¨ 그리기
νλ‘νΌν°κ° μ°μ° νλ‘νΌν° μΌ λ: { get} , {get set} κ°λ₯
νλ‘νΌν°κ° μ μ₯ νλ‘νΌν° μΌ λ: λ°λμ {get set} λͺ¨λ μΆκ°
π 2. νλ‘ν μ½μμ mutatingκ³Ό static
ꡬ쑰체 μμ μλ λ©μλκ° νλ‘νΌν°λ₯Ό λ³κ²½ν κ²½μ° λ©μλ μμ mutating ν€μλλ₯Ό μ¬μ©ν΄μΌνλ€.
νλ‘ν μ½μμλ λ©μλμ mutating ν€μλλ₯Ό μ¬μ©νλ€λ©΄ μ΄λ₯Ό ꡬννλ ꡬ쑰체μ μ΄κ±°νμμλ mutating ν€μλλ₯Ό μ¬μ©ν΄μΌ νλ€.
static ν€μλλ₯Ό μ¬μ©ν΄ νμ λ©μλμ νμ νλ‘νΌν°λ νλ‘ν μ½μμ μ μν μ μλ€.
λ¨, ν΄λμ€μμ μ¬μ© κ°λ₯ν class ν€μλλ μ¬μ© λΆκ°νλ€.
-> νλ‘ν μ½μ ν΄λμ€, ꡬ쑰체, μ΄κ±°ν λͺ¨λμμ μ¬μ©ν μ μμ΄μΌ νκΈ° λλ¬Έ.
π 3. νλ‘ν μ½κ³Ό μ΄κΈ°ν
ν΄λμ€μμ μ΄κΈ°ν λ©μλλ₯Ό ꡬνν λλ λ°λμ required ν€μλλ₯Ό μ¬μ©νλ€.
import Foundation
protocol Initializable {
init(name: String)
}
//ꡬ쑰체
struct User: Initializable {
var name: String
// νλ‘ν μ½μ μꡬ μ¬νμ μΆ©μ‘±νλ μ΄κΈ°ν λ©μλ
init(name: String) {
self.name = name
}
}
//ν΄λμ€
class Person: Initializable {
var name: String
// νλ‘ν μ½μ μꡬ μ¬νμ μΆ©μ‘±νλ μ΄κΈ°ν λ©μλ
required init(name: String) {
self.name = name
}
}
//μ΄κ±°ν
protocol Initializable {
init(rawValue: String)
}
enum Status: String, Initializable {
case active = "Active"
case inactive = "Inactive"
// νλ‘ν μ½μ μꡬ μ¬νμ μΆ©μ‘±νλ μ΄κΈ°ν λ©μλ
init(rawValue: String) {
self = Status(rawValue: rawValue) ?? .inactive
}
}
π 4. νμ μΌλ‘μ νλ‘ν μ½
νλ‘ν μ½μ νμ μΌλ‘ μ¬μ©ν κ²½μ° λ€νμ±κ³Ό μμ‘΄μ± μμ μμΉμ μ μ©ν μ μλ€.
μ¦, λ€μν νμ μ μΈμ€ν΄μ€λ€μ 곡ν΅λ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ²λ¦¬ν μ μλ€.
νλ‘ν μ½ νμ μΌλ‘ μ μλ λ³μλ μμμ ν λΉλ κ°μ²΄λ νλ‘ν μ½μμλ§ μ μΈλ νλ‘νΌν°μ λ©μλμλ§ μ κ·Ό κ°λ₯νλ€.
ꡬνμμ μΆκ°ν νλ‘νΌν°λ λ©μλλ€μ μ»΄νμΌλ¬λ‘ λΆν° μλλλ€.
μΈμ€ν΄μ€ μ체μ λ©μλλ νλ‘νΌν°λ₯Ό μ¬μ©νκ³ μΆλ€λ©΄ asλ₯Ό ν΅ν΄ λ€μ΄μΊμ€ν ν μ¬μ© νλ€.
1. λ€νμ±
//λ€νμ±
protocol Drawable {
func draw()
}
class Circle: Drawable {
func draw() {
print("Drawing a circle")
}
}
class Square: Drawable {
func draw() {
print("Drawing a square")
}
}
//νμ©1.
let shapes: [Drawable] = [Circle(), Square()] //Drawable νλ‘ν μ½μ μ€μνλ κ°μ²΄λ€λ‘ ꡬμ±
for shape in shapes {
shape.draw()
}
//νμ©2.
let circle = Circle()
let square = Square()
render(shape: circle)
render(shape: square)
2. μμ‘΄μ± μμ μμΉ
//μμ‘΄μ± μμ μμΉ
class DocumentManager {
var drawable: Drawable
init(drawable: Drawable) {
self.drawable = drawable
}
func renderDocument() {
drawable.draw()
}
}
let circle = Circle()
let documentManager = DocumentManager(drawable: circle)
documentManager.renderDocument() // Output: Drawing a circle
π Reference
'π iOS > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Alertκ³Ό λκΈ°/λΉλκΈ° κ°λ (0) | 2024.08.29 |
---|---|
UITextFieldμ λΈλ¦¬κ²μ΄νΈ ν¨ν΄ (0) | 2024.08.28 |
[ Swift ] νλ‘νΌν°(Property) / NetworkManagerμ shared (0) | 2024.08.24 |
SceneDelegateμμ navigationController μ€μ (0) | 2024.08.04 |
register(_:forCellWithReuseIdentifier:) λ©μλμμ PosterCell.selfλ₯Ό μ¬μ©νλ μ΄μ (1) | 2024.08.04 |