티스토리 뷰

Swift Language Guide

Extensions

지우개. 2020. 11. 24. 16:07

Extensions은 기존에 있던 클래스 구조체 열거형 또는 프로토콜 타입에 새로운 기능을 추가할 수 있습니다. Objective-C의 categories와 유사하며 오리지널 소스 코드와는 별개로 다른 곳에서도 덧붙여서 기능을 연장할 수 있습니다.

 

스위프트의 Extensions이 할 수 있는 것들

  • 연산 인스턴스/타입 프로퍼티 추가
  • 인스턴스/타입 메소드 정의
  • 새로운 초기자(이니셜라이저) 제공
  • 서브스크립트 정의
  • 새로운 중첩 타입들 정의 및 사용
  • 프로토콜 준수

익스텐션은 오버라이딩을 할 수 없음.

 

Extension Syntax

extension SomeType {
    // new functionality to add to SomeType goes here
}

extension SomeType: SomeProtocol, AnotherProtocol {
    // implementation of protocol requirements goes here
}

 

Computed Properties

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("One inch is \(oneInch) meters")
// Prints "One inch is 0.0254 meters"
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
// Prints "Three feet is 0.914399970739201 meters"

5가지 단위를 표현할 수 있는 연산 프로퍼티를 선언함.

익스텐션은 저장 프로퍼티나 존재하는 프로퍼티에 프로퍼티 옵서버 추가같은 건 할 수 없음

 

Initializers

클래스의 경우 convenience 이니셜라이저를 추가할 수 있으나 designated 이니셜라이저나 디이니셜라이저는 추가할 수 없음.

이 친구들은 오리지널 클래스 구현부에 구현되어야 하는 친구들이기 때문에. 값 타입의 인스턴스를 추가하기 위해 익스텐션을 사용하고 그 값타입이 모든 프로퍼티에 기본값을 제공하고 커스텀 이니셜라이저를 정의하지 않았다면 기본 이니셜라이저와 멤버와이즈 이니셜라이저를 익스텐션에서 사용할 수 있다.

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()
}

let defaultRect = Rect()
let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0),
   size: Size(width: 5.0, height: 5.0))
   

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)
        //self.init으로 멤버와이즈 이니셜라이저 사용
    }
}

 

Methods

개요에 설명한 것과 같이 별 특이사항 없고 mutating 메소드로 값 타입 내부 프로퍼티 변경도 가능하다 정도

 

Subscripts

메소드처럼 특별한 건 없고 예제가 쓸만해보임. 자리수를 반환하는 Int 타입 익스텐션

extension Int {
    subscript(digitIndex: Int) -> Int {
        var decimalBase = 1
        for _ in 0..<digitIndex {
            decimalBase *= 10
        }
        return (self / decimalBase) % 10
    }
}
746381295[0]
// returns 5
746381295[1]
// returns 9
746381295[2]
// returns 2
746381295[8]
// returns 7

Nested Types

얘도 별다른 것 없다. 예제만 보고 가자

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
        }
    }
}

'Swift Language Guide' 카테고리의 다른 글

Generics(제네릭)  (0) 2020.11.30
Protocols(프로토콜)  (0) 2020.11.26
타입 캐스팅 + 중첩 타입  (0) 2020.11.24
Error Handling(에러 핸들링)  (0) 2020.11.19
Optional Chaining(옵셔널 체이닝)  (0) 2020.11.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함