Bibi's DevLog π€π
[Swift] νλ‘ν μ½ Protocol λ³Έλ¬Έ
[Swift] νλ‘ν μ½ Protocol
Swift νλ‘κ·Έλλ° - 377μͺ½ ~
νλ‘ν μ½ : νΉμ μν (κΈ°λ₯)μ νκΈ° μν λ©μλ, νλ‘νΌν°, κΈ°ν μꡬμ¬νμ μ²μ¬μ§μ μ μν κ²
νλ‘ν μ½μ κΈ°λ₯μ μ μνκ³ μ μν λΏ, μ€μ€λ‘ κΈ°λ₯μ ꡬννλ κ²μ΄ μλλ€.
- ꡬ쑰체/ν΄λμ€/μ΄κ±°νμ νΉμ νλ‘ν μ½μ μ±ν(adopted)ν΄μ κ·Έ μν μ μν μꡬμ¬νμ ꡬννλ€.
- μ΄λ€ νμ μ΄ μ΄λ€ νλ‘ν μ½μ μꡬμ¬νμ λ°λ₯΄λ©΄, 'ν΄λΉ νλ‘ν μ½μ μ€μνλ€(conform)'λΌκ³ νννλ€.
μ€μννΈμμ νλ‘ν μ½μ μμ ν νλμ νμ μΌλ‘ μ¬μ©λλ€.
- νλΌλ―Έν°λ 리ν΄νμ μΌλ‘ μ¬μ© κ°λ₯
- νλ‘νΌν°, λ³μ, μμμ νμ μΌλ‘ μ¬μ© κ°λ₯
- λ°°μ΄ λ± μ»¨ν μ΄λ μμμ νμ μΌλ‘ μ¬μ© κ°λ₯
νλ‘ν μ½ λ§λ€κΈ°
: protocol
ν€μλλ₯Ό μ¬μ©ν΄ μ μΈνλ€.
protocol νλ‘ν μ½μ΄λ¦ {
νλ‘ν μ½ μ μ
}
νλ‘νΌν° μꡬμ¬ν
- νλ‘νΌν°μ νμ νλ‘νΌν° μꡬ κ°λ₯
- νλ‘νΌν° μꡬμ¬νμ νμ
var
λ‘ μ μΈ - νλ‘νΌν°λ₯Ό μ½κΈ° μ μ©(
{ get }
) μΌλ‘ ν μ§, μ½κ³ μ°κΈ°({ get, set }
)λ‘ ν μ§ μ ν΄μ€μΌ ν¨ - ꡬνν λλ νλ‘νΌν°μ μ΄λ¦κ³Ό νμ λ§ λ§μΌλ©΄ λ¨
- νμ
νλ‘νΌν°λ
static
ν€μλλ₯Ό μ¬μ©ν΄ μ μΈ
protocol SomeProtocol {
var settableProperty: String { get set }
var notNeedToBeSettableProperty: String { get }
static var typeProperty: Int { get }
}
λ©μλ μꡬμ¬ν
- μΈμ€ν΄μ€ λ©μλ λλ νμ λ©μλ μꡬ κ°λ₯
- λ©μλμμ ν¨μ bodyλ₯Ό μ μΈνκ³ μκ·Έλμ²λ§ μμ±
- νμ
λ©μλλ
static
ν€μλ μ¬μ©
protocol Sendable {
var from: Sendable { get }
func send(data: Any)
static func isSendableInstance(_ instance: Any) -> Bool
}
κ°λ³ λ©μλ μꡬ mutating method requirements
- κ° νμ (ꡬ쑰체, μ΄κ±°ν)μ μΈμ€ν΄μ€ λ©μλμμ μμ λ΄λΆμ κ°μ λ³κ²½ν λ func μμ mutatingμΌλ‘ μ μΈν΄ μ€λ€.
- κ°λ³ λ©μλλ₯Ό μꡬν νλ‘ν μ½μ ν΄λμ€κ° ꡬνν λλ mutating ν€μλλ₯Ό μλ΅νλ€.
- νλ‘ν μ½μμ κ°λ³ λ©μλλ₯Ό μꡬνμ§ μλλ€λ©΄, mutating λ©μλλ ꡬνμ΄ λΆκ°λ₯νλ€
protocol Resettable {
mutating func reset()
}
struct Point: Resettable {
var x: Int = 0
var y: Int = 0
mutating func reset() {
self.x = 0
self.y = 0
}
}
μ΄λμ λΌμ΄μ μꡬ
- λ©μλμ λ§μ°¬κ°μ§λ‘ μ΄λμ λΌμ΄μ μ 맀κ°λ³μλ§ μ§μ νκ³ , bodyλ ꡬννμ§ μλλ€.
- ν΄λμ€ νμ
μμ νλ‘ν μ½μ΄ μꡬν μ΄λμ
λΌμ΄μ λ₯Ό ꡬνν λλ
required
ν€μλλ₯Ό λΆμΈ μꡬ μ΄λμ λΌμ΄μ λ‘ κ΅¬ννλ€.- ν΄λΉ ν΄λμ€λ₯Ό μμλ°λ λͺ¨λ ν΄λμ€λ κ°μ νλ‘ν μ½κ³Ό μꡬ μ΄λμ λΌμ΄μ λ₯Ό ꡬνν΄μΌ νκΈ° λλ¬Έ.
- μμν μ μλ final ν΄λμ€λΌλ©΄
required
λ₯Ό μλ΅ κ°λ₯ν¨
- νλ‘ν μ½μ΄ μꡬν μ΄λμ
λΌμ΄μ κ° κ΅¬νλ ν΄λμ€λ₯Ό μμλ°μ ν΄λμ€μμλ
required override
λ₯Ό λͺ¨λ λͺ μν΄μΌ ν¨ - μ€ν¨ κ°λ₯ν μ΄λμ λΌμ΄μ λ μꡬ κ°λ₯
protocol Name {
var name: String { get }
init(name: String)
}
class Person: Named {
var name: String
required init(name: String) {
self.name = name
}
}
νλ‘ν μ½ μ±ννκΈ°
- ꡬ쑰체, ν΄λμ€, μ΄κ±°ν λ±μμ νμ μ΄λ¦ λ€μ μ½λ‘ μ λΆμΈ ν, μ±νν νλ‘ν μ½μ μΌνλ‘ λμ΄ν¨
- ν΄λμ€ μμλ ν¨κ» λ°λ κ²½μ°, μμλ°λ ν΄λμ€ μ΄λ¦ λ€μμ νλ‘ν μ½ λμ΄
struct SomeStruct: AProtocol, AnotherProtocol {
}
νλ‘ν μ½μ μμ
- νλ‘ν μ½λΌλ¦¬λ μμμ΄ κ°λ₯νλ€.
- λ¬Έλ²μ ν΄λμ€ μμ λ¬Έλ²κ³Ό μ μ¬νλ€.
- ꡬνν λλ μμλ°μ νλ‘ν μ½μ μꡬμ¬νκΉμ§ λͺ¨λ ꡬνν΄μΌ νλ€.
protocol Readable {
func read()
}
protocol Writeable {
func write()
}
protocol ReadWriteSpeakable: Readable, Writeable {
func speak()
}
ν΄λμ€ μ μ© νλ‘ν μ½
- νλ‘ν μ½μ μμ 리μ€νΈμ
class
ν€μλλ₯Ό μΆκ°νλ©΄, νλ‘ν μ½μ΄ ν΄λμ€ νμ μλ§ μ±νλ μ μλλ‘ μ νν μ μλ€. - 맨 μ²μμ
class
ν€μλλ₯Ό λ£μ΄μΌ νλ€.
protocol ClassOnlyProtocol: class, Readable, Writeable {
// μ΄ νλ‘ν μ½μ ν΄λμ€μμλ§ μ±ν κ°λ₯
}
νλ‘ν μ½ μ‘°ν©(composition)
- 맀κ°λ³μ νμ
μ μ¬λ¬ νλ‘ν μ½μ ν λ²μ μ‘°ν©νμ¬ μꡬν μ μμ
- μ£Όμ΄μ§ νλ‘ν μ½μ λͺ¨λ μ€μν΄μΌ ν¨
- 맀κ°λ³μ νλκ° νλ‘ν μ½μ λ μ΄μ μꡬν μ μμ
- νΉμ ν΄λμ€μ μΈμ€ν΄μ€ μν μ ν μ μλμ§λ ν¨κ» νμΈν μ μμ
- λ¨, ν΄λμ€λ ν νμ λ§ μ‘°ν©ν μ μμ
protocol Named {
var name: String { get }
}
protocol Aged {
var age: Int { get }
}
func celebrateBirthday(to celebrator: Named & Aged) {
print("Happy Birthday \(celebrator.name)! Now you ard \(celebrator.age)")
}
class Car: Named {
var name: String
init(name: String) {
self.name = name
}
}
var someVariable: Car & Named
νλ‘ν μ½ μ€μ νμΈ
νμ μΊμ€ν μ is, as μ°μ°μλ‘ λμμ΄ νλ‘ν μ½μ μ€μνλμ§ νμΈνκ±°λ, νΉμ νλ‘ν μ½λ‘ μΊμ€ν ν μ μλ€.
is
: ν΄λΉ μΈμ€ν΄μ€κ° νλ‘ν μ½μ μ€μνλμ§ νμΈas?
: λ€λ₯Έ νλ‘ν μ½λ‘ λ€μ΄μΊμ€ν μλas!
: λ€λ₯Έ νλ‘ν μ½λ‘ κ°μ λ€μ΄μΊμ€ν
struct Person: Named, Aged {
var name: String
var age: Int
}
let bibi: Person = Person(name: "bibi", age: 99)
print(bibi is Named) // true
print(bibi is Aged) // true
if let castedInstance: Name = bibi as Named {
print("\(castedInstance) is Named")
} // Person is Named
νλ‘ν μ½ λ³μμ μμ
- νλ‘ν μ½μ νμ μΌλ‘ κ°λ λ³μ/μμμλ, κ·Έ νλ‘ν μ½μ μ€μνλ νμ μ μ΄λ€ μΈμ€ν΄μ€λ ν λΉν μ μλ€.
- νλ‘ν μ½λ§μΌλ‘ μ€μ€λ‘ μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°νλ₯Ό ν μλ μλ€.
μμμ μν νλ‘ν μ½ (Delegation)
- μμ(Delegation λΈλ¦¬κ²μ΄μ
) : ν΄λμ€λ κ΅¬μ‘°μ²΄κ° μμ μ μ±
μμ λ€λ₯Έ μΈμ€ν΄μ€μκ² μμνλ λμμΈ ν¨ν΄.
- μ± μμ μννλλ‘ μ μν νλ‘ν μ½μ μ€μνλ νμ μ κ·Έ μ± μμ μνν¨μ΄ 보μ₯λλ―λ‘, νλ‘ν μ½μ μ€μν λ μ± μμ μμν μ μλ€.
- μμ ν¨ν΄μ μ ν νλ μμν¬μμ μ¬μ©νλ μ£Όμ ν¨ν΄μ΄λ€.
- λ€μν νλ‘ν μ½μ΄ "
...Delegate
"μκ°μ μ΄λ¦μΌλ‘ μ μλμ΄ μλ€. - μ)
UITableView
νμ μ μΈμ€ν΄μ€κ° ν μΌμ μμλ°μ μ²λ¦¬νλ μΈμ€ν΄μ€λUITableViewDelegate
νλ‘ν μ½μ μ€μν΄μΌ ν¨
- λ€μν νλ‘ν μ½μ΄ "
'π±π iOS > π Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] ===(_:_:) μ !==(_:_:) (0) | 2022.10.12 |
---|---|
λμΌμ±κ³Ό λλ±μ± Identity and Equality (Swift) (0) | 2022.10.12 |
[Swift] removeFirst(), removeLast(), removeFirst(_:), removeLast(_:) (2) | 2022.10.06 |
[Swift] μΈμ€ν΄μ€ λΉκ΅ λ°©λ² - is, λ©ν νμ (0) | 2022.08.02 |
[Swift] String.Index (κ·Έλ¦¬κ³ Substring) - λ¬Έμμ΄μ νΉμ λ¬Έμ ꡬνκΈ° (0) | 2022.07.28 |