[swift] extension, 확장

이은수, Lee EunSoo·2024년 10월 2일
0

Swift Basic

목록 보기
17/24
post-thumbnail
post-custom-banner

개요

swift에선 클래스나 구조체, 열거형 타입에 대해서 확장(extension)을 지원한다.

확장을 이용하면 기존에 정의 된 타입들에 대해 새로운 기능을 추가 할 수 있는데 심지어 일반적으로 수정이 불가능하게 설정된 클래스나 구조체등에 확장을 해서 새로운 기능을 추가하는 것이 가능하다.

확장할 수 있는것

  1. 계산프로퍼티와 타입프로퍼티 추가 가능
  2. 생성자 추가 가능
  3. 서브스크립트 추가 가능
  4. 내부 메소드와 타입 메소드 추가 가능
  5. 새로운 중첩된 타입 정의와 사용
    5.1 내부 타입(클래스/구조체/열거형)추가 및 사용 가능
  6. 새로운 프로토콜 채택및 구현가능

저장 프로퍼티는 확장이 불가능하다.

사용방법

extension SomeType {

}

↳ 다음과 같은 형태로 확장을 선언한다.

계산 프로퍼티 추가

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")
//"One inch is 0.0254 meters"

생성자 추가

extension someClass {
    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)
    }
}

서브 스크립트 추가

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

Int는 구조체로 정의 되어있기에 Int구조체를 확장한 예시이다.

메소드 추가

extension Int {
    func repetitions(task: () -> Void) {
        for _ in 0..<self {
            task()
        }
    }
}

3.repetitions {
    print("Hello!")
}
// Hello!
// Hello!
// Hello!

인스턴스 메소드 추가

extension Int {
    mutating func square() {
        self = self * self
    }
}
var someInt = 3
someInt.square()
// someInt is now 9

중첩 타입 추가

extension Int {
    enum Kind {
        case negative, zero, positive
    }
}

Int 구조체에 Kind열거형을 내부에 중첩으로 추가 선언해 주었다.

프로토콜 추가

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

↳ 프로토콜을 추가로 채택할 수 있다.

정리

  1. 확장(extension)은 이미 만들어진 타입(클래스, 구조체, 열거형)에 기능을 추가하고 싶은때 사용하는 기능이다.
  2. 사용자 정의 타입뿐만 아니라 Int,Double등 이미 swift에 정의된 타입들의 확장도 가능하다.
  3. 저장 프로퍼티는 추가가 불가능하다.
profile
iOS 개발자 취준생, 천 리 길도 한 걸음부터
post-custom-banner

0개의 댓글