μλ νμΈμ. μ€λμ Swiftμ 'νμ₯(Extensions)'μ λν΄ μμλ³΄κ² μ΅λλ€. νμ₯μ μ¬μ©νλ©΄ κΈ°μ‘΄ νμ μ μλ‘μ΄ κΈ°λ₯μ μ½κ² μΆκ°ν μ μμ΄, μ½λμ μ¬μ¬μ©μ±κ³Ό μ μ°μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
π νμ₯μ΄λ?
νμ₯(Extensions)μ κΈ°μ‘΄μ ν΄λμ€, ꡬ쑰체, μ΄κ±°ν, νλ‘ν μ½μ μλ‘μ΄ κΈ°λ₯μ μΆκ°νλ λ°©λ²μ λλ€. μ¬μ§μ΄ μμ€ μ½λμ μ κ·Όν μ μλ νμ λ νμ₯ν μ μλ€λ μ μ΄ ν° μ₯μ μ λλ€. μ΄λ₯Ό 'μκΈ λͺ¨λΈλ§(retroactive modeling)'μ΄λΌκ³ ν©λλ€.
μ°Έκ³ : Swiftμ νμ₯μ Objective-Cμ μΉ΄ν κ³ λ¦¬μ μ μ¬νμ§λ§, Swift νμ₯μ μ΄λ¦μ΄ μλ€λ μ°¨μ΄κ° μμ΅λλ€.
π νμ₯μΌλ‘ ν μ μλ κ²
Swiftμμ νμ₯μ ν΅ν΄ λ€μκ³Ό κ°μ κΈ°λ₯μ μΆκ°ν μ μμ΅λλ€:
- κ³μ°λ νλ‘νΌν° (μΈμ€ν΄μ€ λ° νμ νλ‘νΌν°)
- λ©μλ (μΈμ€ν΄μ€ λ° νμ λ©μλ)
- μλ‘μ΄ μ΄κΈ°ν ꡬ문
- μλΈμ€ν¬λ¦½νΈ
- μ€μ²© νμ
- νλ‘ν μ½ μ€μ
μ€μν μ ν μ¬ν: νμ₯μ κΈ°μ‘΄ κΈ°λ₯μ μ¬μ μν μ μμΌλ©°, μ μ₯ νλ‘νΌν°λ₯Ό μΆκ°νκ±°λ κΈ°μ‘΄ νλ‘νΌν°μ νλ‘νΌν° κ΄μ°°μλ₯Ό μΆκ°ν μ μμ΅λλ€.
π νμ₯ ꡬ문
νμ₯μ extension ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈν©λλ€:
extension SomeType {
// μ¬κΈ°μ SomeTypeμ μΆκ°ν μ κΈ°λ₯μ μμ±ν©λλ€
}
νλ‘ν μ½μ μ€μνλλ‘ νμ μ νμ₯ν μλ μμ΅λλ€:
extension SomeType: SomeProtocol, AnotherProtocol {
// νλ‘ν μ½ μꡬμ¬ν ꡬν
}
π κ³μ°λ νλ‘νΌν° μΆκ°νκΈ°
νμ₯μ ν΅ν΄ κΈ°μ‘΄ νμ μ κ³μ°λ νλ‘νΌν°λ₯Ό μΆκ°ν μ μμ΅λλ€. λ€μ μμ λ Swiftμ Double νμ μ 거리 λ¨μ λ³ν νλ‘νΌν°λ₯Ό μΆκ°ν©λλ€:
extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4.mm
print("1μΈμΉλ \(oneInch) λ―Έν°μ
λλ€")
// μΆλ ₯: "1μΈμΉλ 0.0254 λ―Έν°μ
λλ€"
let threeFeet = 3.ft
print("3νΌνΈλ \(threeFeet) λ―Έν°μ
λλ€")
// μΆλ ₯: "3νΌνΈλ 0.914399970739201 λ―Έν°μ
λλ€"
μ΄λ¬ν νμ₯μ μ¬μ©νλ©΄ λ¨μ λ³ν κ³μ°μ μμ£Ό μ§κ΄μ μΌλ‘ ννν μ μμ΅λλ€:
let aMarathon = 42.km + 195.m
print("λ§λΌν€μ \(aMarathon) λ―Έν°μ
λλ€")
// μΆλ ₯: "λ§λΌν€μ 42195.0 λ―Έν°μ
λλ€"
π μ΄κΈ°ν ꡬ문 μΆκ°νκΈ°
νμ₯μ ν΅ν΄ κΈ°μ‘΄ νμ μ μλ‘μ΄ μ΄κΈ°ν ꡬ문μ μΆκ°ν μ μμ΅λλ€.
μ€μ: ν΄λμ€ νμ₯μλ νΈμ μ΄κΈ°ν κ΅¬λ¬Έλ§ μΆκ°ν μ μμΌλ©°, μ§μ μ΄κΈ°ν ꡬ문μ΄λ μ΄κΈ°ν ν΄μ ꡬ문μ μΆκ°ν μ μμ΅λλ€.
λ€μμ Rect ꡬ쑰체μ μ€μ¬μ κ³Ό ν¬κΈ°λ‘ μ΄κΈ°ννλ μ μ΄κΈ°ν ꡬ문μ μΆκ°νλ μμ μ λλ€:
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
}
extension Rect {
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
size: Size(width: 3.0, height: 3.0))
// centerRectμ μμ μ (2.5, 2.5)μ΄κ³ ν¬κΈ°λ (3.0, 3.0)μ
λλ€
μ΄ μμ μμ Rect ꡬ쑰체λ μλ κΈ°λ³Έ μ΄κΈ°ν ꡬ문과 λ©€λ²λ³ μ΄κΈ°ν κ΅¬λ¬Έλ§ κ°μ§κ³ μμμ§λ§, νμ₯μ ν΅ν΄ μ€μ¬μ κ³Ό ν¬κΈ°λ‘ μ΄κΈ°ννλ μλ‘μ΄ λ°©λ²μ μΆκ°νμ΅λλ€.
π λ©μλ μΆκ°νκΈ°
νμ₯μ ν΅ν΄ κΈ°μ‘΄ νμ μ μλ‘μ΄ μΈμ€ν΄μ€ λ©μλμ νμ λ©μλλ₯Ό μΆκ°ν μ μμ΅λλ€:
extension Int {
func repetitions(task: () -> Void) {
for _ in 0..<self {
task()
}
}
}
3.repetitions {
print("μλ
νμΈμ!")
}
// μΆλ ₯:
// μλ
νμΈμ!
// μλ
νμΈμ!
// μλ
νμΈμ!
μ΄ νμ₯μ ν΅ν΄ μ μμ repetitions(task:) λ©μλλ₯Ό μΆκ°νμ¬, νΉμ μμ μ ν΄λΉ μ«μλ§νΌ λ°λ³΅ μ€νν μ μκ² λμμ΅λλ€.
λ³κ²½ λ©μλ(Mutating Methods)
ꡬ쑰체λ μ΄κ±°νμ selfλ₯Ό λ³κ²½νλ λ©μλμ mutating ν€μλλ₯Ό μ¬μ©ν΄μΌ ν©λλ€:
extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.square()
// someIntλ μ΄μ 9μ
λλ€
μ΄ νμ₯μ μ μ κ°μ μ κ³±νμ¬ μκΈ° μμ μ λ³κ²½νλ λ©μλλ₯Ό μΆκ°ν©λλ€.
π μλΈμ€ν¬λ¦½νΈ μΆκ°νκΈ°
νμ₯μ ν΅ν΄ κΈ°μ‘΄ νμ μ μλ‘μ΄ μλΈμ€ν¬λ¦½νΈλ₯Ό μΆκ°ν μ μμ΅λλ€:
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
746381295[0] // 5 λ°ν
746381295[1] // 9 λ°ν
746381295[2] // 2 λ°ν
746381295[8] // 7 λ°ν
μ΄ νμ₯μ μ μμ νΉμ μλ¦Ώμμ μ κ·Όν μ μλ μλΈμ€ν¬λ¦½νΈλ₯Ό μΆκ°ν©λλ€. μλ₯Ό λ€μ΄, μ«μμ μ€λ₯Έμͺ½μμλΆν° 0λ² μΈλ±μ€λ μΌμ μ리, 1λ² μΈλ±μ€λ μμ μ리λ₯Ό λνλ λλ€.
π μ€μ²© νμ μΆκ°νκΈ°
νμ₯μ ν΅ν΄ κΈ°μ‘΄ νμ μ μλ‘μ΄ μ€μ²© νμ μ μΆκ°ν μ μμ΅λλ€:
extension Int {
enum Kind {
case negative, zero, positive
}
var kind: Kind {
switch self {
case 0:
return .zero
case let x where x > 0:
return .positive
default:
return .negative
}
}
}
func printIntegerKinds(_ numbers: [Int]) {
for number in numbers {
switch number.kind {
case .negative:
print("- ", terminator: "")
case .zero:
print("0 ", terminator: "")
case .positive:
print("+ ", terminator: "")
}
}
print("")
}
printIntegerKinds([3, 19, -27, 0, -6, 0, 7])
// μΆλ ₯: "+ + - 0 - 0 + "
μ΄ νμ₯μ Int νμ μ μ«μμ λΆνΈλ₯Ό λνλ΄λ Kind μ΄κ±°νκ³Ό ν΄λΉ μ μμ μ’ λ₯λ₯Ό λ°ννλ kind κ³μ° νλ‘νΌν°λ₯Ό μΆκ°ν©λλ€.
π νμ₯μ μ€μ©μ νμ© μ¬λ‘
νμ₯μ λ€μκ³Ό κ°μ μν©μμ νΉν μ μ©ν©λλ€:
- νμ€ λΌμ΄λΈλ¬λ¦¬ νμ νμ₯: String, Array, Int λ±μ νλ‘μ νΈμ νΉνλ κΈ°λ₯ μΆκ°
- νλ‘ν μ½ μ€μ: κΈ°μ‘΄ νμ μ΄ μ νλ‘ν μ½μ μ€μνλλ‘ λ§λ€κΈ°
- μ½λ ꡬμ±: ν° νμ μ κΈ°λ₯μ λ Όλ¦¬μ κ·Έλ£ΉμΌλ‘ λΆλ¦¬
- Swiftier API: Objective-C APIλ₯Ό Swift μ€νμΌλ‘ κ°μ
- κΈ°λ₯ λͺ¨λν: νΉμ κΈ°λ₯λ§ νμν κ²½μ°μ μ νμ μΌλ‘ νμ₯ κ°λ₯
π νμ₯μ μ₯μ
- μ½λ μ¬μ¬μ©μ±: κΈ°μ‘΄ νμ μ μλ‘μ΄ κΈ°λ₯μ μ½κ² μΆκ°
- μμ€ μ κ·Ό μμ΄ νμ₯ κ°λ₯: νμ€ λΌμ΄λΈλ¬λ¦¬λ μλνν° νλ μμν¬μ νμ λ νμ₯ κ°λ₯
- μ½λ λΆλ¦¬μ ꡬμ±: κ΄λ ¨ κΈ°λ₯μ λ Όλ¦¬μ μΌλ‘ λΆλ¦¬νμ¬ κ°λ μ± ν₯μ
- μ μ§λ³΄μμ±: μλ³Έ νμ μ μμ νμ§ μκ³ μ κΈ°λ₯ μΆκ° κ°λ₯
- νλ‘ν μ½ μ§ν₯ νλ‘κ·Έλλ°: νλ‘ν μ½ νμ₯κ³Ό ν¨κ» κ°λ ₯ν μΆμν μ 곡
π νμ₯ μ¬μ© μ μ£Όμμ¬ν
- μ μ₯ νλ‘νΌν° μΆκ° λΆκ°: νμ₯μΌλ‘λ μ μ₯ νλ‘νΌν°λ₯Ό μΆκ°ν μ μμ΅λλ€
- κΈ°μ‘΄ κΈ°λ₯ μ¬μ μ λΆκ°: μ΄λ―Έ μ‘΄μ¬νλ κΈ°λ₯μ λ³κ²½ν μ μμ΅λλ€
- μ΄κΈ°ν ꡬ문 μ ν: ν΄λμ€μλ νΈμ μ΄κΈ°ν κ΅¬λ¬Έλ§ μΆκ°ν μ μμ΅λλ€
- νλ‘ν μ½ νμ₯ μ ν: νλ‘ν μ½ νμ₯μμ μ 곡νλ ꡬνμ μ§μ μ¬μ μν μ μμ΅λλ€
- λ€μ΄λ° μΆ©λ μ£Όμ: λ€μν νμ₯μΌλ‘ μΈν μ΄λ¦ μΆ©λ κ°λ₯μ±μ μ£Όμν΄μΌ ν©λλ€
π μ 리
Swiftμ νμ₯μ κΈ°μ‘΄ νμ μ μλ‘μ΄ κΈ°λ₯μ μΆκ°νλ λ°©λ²μ μ 곡ν©λλ€. μ½λ μ¬μ¬μ©μ±, λͺ¨λν, κ°λ μ±μ λμ΄λ λ° κΈ°μ¬νλ©°, νλ‘ν μ½ μ§ν₯ νλ‘κ·Έλλ°μ λκ΅¬λ‘ μ¬μ©λ©λλ€.
νμ₯μ ν΅ν΄ Swift νμ€ λΌμ΄λΈλ¬λ¦¬λ μΈλΆ νλ μμν¬μ νμ μ μ°λ¦¬μ νμμ λ§κ² νμ₯ν¨μΌλ‘μ¨, λ ννλ ₯ μκ³ μ§κ΄μ μΈ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
'π₯ Bread Basics > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Swift 곡μ λ¬Έμ μ 리 - μλ μ°Έμ‘° μΉ΄μ΄ν (Automatic Reference Counting) (0) | 2025.04.13 |
---|---|
Swift 곡μ λ¬Έμ μ 리 - λΆν¬λͺ ν νμ (Opaque Types) (0) | 2025.04.13 |
Swift 곡μ λ¬Έμ μ 리 - μ λλ¦ (Generics) (0) | 2025.04.13 |
Swift 곡μ λ¬Έμ μ 리 - νλ‘ν μ½ (Protocols) (0) | 2025.04.13 |
Swift 곡μ λ¬Έμ μ 리 - μ€μ²©λ νμ (Nested Types) (1) | 2025.04.12 |
Swift 곡μ λ¬Έμ μ 리 - νμ μΊμ€ν (Type Casting) (0) | 2025.04.12 |
Obj-C 곡μ λ¬Έμ μ 리 - κ°μ²΄, ν΄λμ€, λ©μμ§ (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - λ§€ν¬λ‘ (Macros) (0) | 2025.04.11 |