[iOS] Equatable μ΄λ?
Equatable μ κ°μ λλ±μ± λΉκ΅ κΈ°λ₯μ μ 곡νλ νμ μ λλ€.
μ₯? νλ‘ν μ½μΈλ° μ νμ μ΄λ?
μ€μννΈμμλ νλ‘ν μ½λ νμ μ λλ€! π²
κ΄λ ¨ κΈ: Protocol as Types
μ€μννΈμμ κ°μ κ°μμ == (equal to) μ != (not equal to) μ°μ°μλ‘ λΉκ΅ν©λλ€.
Equatable νλ‘ν μ½μ μ±νν νμ μ == μ != μ°μ°μλ₯Ό μ¬μ©ν μ μμ΅λλ€.
Swiftμ primitive type λ€μ Equatable μ μλμΌλ‘ μ§μν©λλ€. (Int, Double, String ... λ±)
κ·Έλ λ€λ©΄ 컀μ€ν νμ μΈ enum, struct, class μ κ²½μ°λ μ΄λ¨κΉμ?
νλμ© λ³΄κ² μ΅λλ€.ππ»ππ»ππ»
enum
κ΄λ ¨ κΈ : emumeration μ΄μ 리
μ°κ΄ κ°μ΄ μλ κΈ°λ³Έ μ΄κ±°ν ννμΌ κ²½μ° Equtable νλ‘ν μ½ conformance(μ±ν) λ₯Ό μ μΈνμ§ μμλ μλμΌλ‘ μ§μν©λλ€.
enum Color {
case red,green,blue
}
var foregroundColor = Color.red
var backgroundColro = Color.blue
forgroundColor == backgroundColor // false
μ°κ΄ κ°μ΄ μλ κ²½μ°, μ°κ΄ κ°μ νμ μ΄ Equatable μ μ±νν κ²½μ° νλ‘ν μ½ conformance μ μΈλ§ ν΄μ£Όλ©΄ μλ μ§μν©λλ€.
κ·Έλ μ§ μμ κ²½μ° μ§μ == κ³Ό != μ°μ°μλ₯Ό ꡬνν΄μ£Όμ΄μΌ ν©λλ€.
" μ°μ°μλ ν¨μμ λλ€ "
μ ν ν½κ³Όλ κ΄λ ¨μ΄ μμ§λ§, ν¨μλ μΌκΈ κ°μ²΄ μ΄λ―λ‘ λ³μμ μ μ₯, νλΌλ―Έν°λ‘ μ λ¬, λ¦¬ν΄ κ°μΌλ‘ μ¬μ©μ΄ κ°λ₯ν©λλ€.
λνμ μΈ κ³ μ°¨ν¨μμΈ map, filter, reduce λ±μ λλ²μ§Έ νλΌλ―Έν°μ '+', '-' μ κ°μ μ°μ°μλ§ μ λ¬ν μ μλ μ΄μ λ μ°μ°μλ ν¨μμ΄κΈ° λλ¬Έμ λλ€.
struct
μ μ₯ μμ±μ΄ Equatableμ μ±νν νμ μΌλ‘ μ΄λ£¨μ΄μ Έ μμΌλ©΄ νλ‘ν μ½ conformance μ μΈλ§ ν΄μ£Όλ©΄ μλ μ§μν©λλ€.
κ·Έλ μ§ μμ κ²½μ° μ§μ == κ³Ό != μ°μ°μλ₯Ό ꡬν ν΄μ£Όμ΄μΌ ν©λλ€.
struct Point: Equatable {
var x: Double
var y: Double
}
var x = Point(x:1, y:2)
var y = Point(x:2, y:3)
x == y // false
// μλ μ 곡λμ§λ§ μ§μ ꡬνν΄μ€λ€λ©΄ μ΄λ°μμ μ½λκ° κ°λ₯ν©λλ€.
// '==' μ°μ°μλ§ κ΅¬ννλ©΄ '!=' μ°μ°μλ μλμ 곡λ©λλ€.
extension Point {
static func ==(lhs: Point, rhs: Point) -> Bool {
return (lhs.x == rhs.x) && (lhs.y == rhs.y)
}
}
class
ꡬνμ΄ μλ μ 곡λμ§ μμΌλ―λ‘, νλ‘ν μ½ conformance λ₯Ό μ μΈνκ³ μ°μ°μλ₯Ό μ§μ ꡬνν΄μ£Όμ΄μΌ ν©λλ€.
class StreetAddress {
let number: String
let street: String
let unit: String?
init(_ number: String, _ street: String, unit: String? = nil) {
self.number = number
self.street = street
self.unit = unit
}
}
// '==' μ°μ°μλ₯Ό μ§μ ꡬνν΄μ£Όμ΄μΌνλ€. == μ΄ κ΅¬νλλ©΄ != λ μλ μ 곡λλ€.
extension StreetAddress: Equatable {
static func == (lhs: StreetAddress, rhs: StreetAddress) -> Bool {
return
lhs.number == rhs.number &&
lhs.street == rhs.street &&
lhs.unit == rhs.unit
}
}
Equality is Separate From Identity
Equatableμ κ°μ΄ κ°μμ§ νλ¨νλ μ°μ°μμ κ΄λ ¨λ νλ‘ν μ½μ λλ€.
'==' μ '!='
κ°μ μΈμ€ν΄μ€μμ νλ¨νλ μ°μ°μκ° μλλλ€.
κ°μ μΈμ€ν΄μ€μμ νλ¨ν λλ '===' μ°μ°μλ₯Ό μ¬μ©ν©λλ€.
λ!