-
Adopting a Protocol Using a Synthesized Implementation - ProtocolsiOS/π Swift 2021. 1. 27. 23:40
μ€μννΈλ μ¬λ¬ κ°λ¨ν ν΄λμ€λ€μκ² μλμ μΌλ‘ `Equatable`, `Hashable` κ·Έλ¦¬κ³ `Comparable` νλ‘ν μ½ μμ(conformance) μ μ 곡ν©λλ€.
`conform to protocol`μ νκΈ° μν ꡬνμ΄ μλμΌλ‘ μ 곡λλ€λ μλ―Έμ λλ€.
μ¬λ¬ κ°λ¨ν ν΄λμ€: Numbers, String λ±μ΄ μμ΅λλ€.
+) Numbers. String μ Foundation Framework μ primitive type μ λλ€.
μ΄ ν΅ν©λ ꡬνμ μ¬μ©νλ€λ κ²μ νλ‘ν μ½ μ±νμ μν λ³λμ λ°λ³΅μ μΈ μμ©μ½λ(boilerplate) ꡬνμ΄ νμ μλ€λ κ²μ μλ―Έν©λλ€.
ν΅ν©λ ꡬν : synthesized implementation
νλ‘ν μ½μ μ μΈκ³Ό ꡬνμ΄ λͺ¨λ λμ΄μμ΄μ μ±ννλ €λ νμ μ μ μΈλ§ νλ©΄ λλ―λ‘, ν΅ν©λμλ€λ ννμ μ¬μ©ν κ² κ°μ΅λλ€.
μ€μννΈλ λ€μκ³Ό κ°μ μ’ λ₯μ Custom typeμ λν΄ `Equatable` ν΅ν©λ ꡬνμ μ 곡ν©λλ€:
-
μ μ₯ μμ±λ§μ κ°μ§λ©΄μ, κ·Έ μμ±λ€μ΄ λͺ¨λ `Equatable`μ λ°λ₯΄λ(conform) ꡬ쑰체
-
`Equatable`μ λ°λ₯΄λ associated type λ§μ κ°μ§λ μ΄κ±°ν
-
associated typeμ΄ μλ μ΄κ±°ν
`==` μ°μ°μμ λν ν΅ν©λ ꡬνμ λ°μΌλ €λ©΄, μλ³Έ νμ μ μΈμμ `Equatable` μ±νμ μ μΈν΄μΌ ν©λλ€.
κ·Έλ¦¬κ³ μ§μ `==` μ°μ°μλ₯Ό ꡬννμ§ μμλ λ©λλ€.
`Equatable` νλ‘ν μ½μ `!=` μ°μ°μμ ꡬνλ μ 곡ν©λλ€.
μλ Vector3D ꡬ쑰체 λ 3μ°¨μ λ²‘ν° ννμ μν (x, y, z) μ μ₯ μμ±μ κ°μ§κ³ μμ΅λλ€.
x, y, z μμ±μ λͺ¨λ `Equatable` νμ μ΄κΈ° λλ¬Έμ, Vector3D λ `==` , `!=` μ°μ°μ(equivalence operators) λ₯Ό μ 곡λ°μ΅λλ€.
κΈ μμͺ½μ `μ μ₯μμ±λ§μ κ°μ§λ©΄μ, κ·Έ μμ±λ€μ΄ λͺ¨λ `Equatable`μ λ°λ₯΄λ(conform) ꡬ쑰체`μ ν΄λΉλ©λλ€.
νλ‘ν μ½μ νμ μ΄κΈ° λλ¬Έμ, κ·Έ νλ‘ν μ½μ μ±νν νμ λ ν΄λΉ νλ‘ν μ½ νμ μΌλ‘ μ·¨κΈν μ μμ΅λλ€.
λ°λΌμ Vector3Dλ `Equatable` νμ μ΄λΌκ³ μ·¨κΈν μ μμ΅λλ€.
struct Vector3D: Equatable { var x = 0.0, y = 0.0, z = 0.0 } let twoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0) let anotherTwoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0) if twoThreeFour == anotherTwoThreeFour { print("These two vectors are also equivalent.") } // Prints "These two vectors are also equivalent."
μ€μννΈλ λ€μκ³Ό κ°μ μ’ λ₯μ Custom typeμ λν΄ `Hashable` ν΅ν©λ ꡬνμ μ 곡ν©λλ€:
-
μ μ₯μμ±λ§μ κ°μ§λ©΄μ, κ·Έ μμ±λ€μ΄ λͺ¨λ `Hashable`μ λ°λ₯΄λ(conform) ꡬ쑰체
-
`Hashable`μ λ°λ₯΄λ associated type λ§μ κ°μ§λ μ΄κ±°ν
-
associated typeμ΄ μλ μ΄κ±°ν
hash(into:) μ°μ°μλ₯Ό μ 곡λ°μΌλ €λ©΄ ν΄λΉ νμ μ `Hashable` μ±ν μ μΈμ νλ©΄λ©λλ€.
hash(into:)μ ꡬνμ λ°λ‘ νμ μμ΅λλ€.
μ€μννΈλ `raw value`λ₯Ό κ°μ§μ§ μμ μ΄κ±°νμ `Comparable` μ λν ν΅ν©λ ꡬνμ μ 곡ν©λλ€.
μ΄κ±°νμ΄ `associated type`μ κ°μ§κ³ μλ€λ©΄ κ·Έ νμ μ `Comparable` νλ‘ν μ½μ λ°λμ λ°λΌμΌ ν©λλ€.
μλ₯Ό λ€μ΄ associated typeμ΄ `Int`λΌλ©΄, `Int`λ `Comparable`μ λ°λ₯΄λ―λ‘ μ΄κ±°νμ `Comparable`μ λ°λ₯΄κ² λ©λλ€.
`<` μ°μ°μλ₯Ό μ 곡λ°μΌλ €λ©΄ ν΄λΉ νμ μ `Comparable` μ±νμ ν΄μΌ ν©λλ€.
`Comparable` νλ‘ν μ½ μ κΈ°λ³Έμ μΌλ‘ ꡬνλμ΄ μκΈ° λλ¬Έμ λλ¨Έμ§ μ°μ°μ ( <=, >, >= ) λ€λ ν¨κ» μ 곡λ©λλ€.
λ!
'iOS > π Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Access Control (μ κ·Ό μ μ΄) (0) 2021.02.17 Computed Properties (κ³μ° μμ±) - Properties (0) 2021.02.02 [Swift] Delegation (0) 2021.01.26 Checking Type & Downcasting - Type Casting (0) 2021.01.21 Type Casting Overview - Type Casting (0) 2021.01.21 -