Swift/문법

익스텐션(extension)

khon98 2021. 1. 30. 12:11

익스텐션

- 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있는 기능

- 기능을 추가하려는 타입의 구현된 소스코드를 알지 못하거나 볼 수 없다 해도 타입만 알고 있다면 그 타입의 기능을 확장할 수도 있음

- 기존에 존재하는 타입이 추가적으로 다른 프로토콜을 채택할 수 있도록 확장할 수 있음

 

extension 확장할 타입 이름 {

타입에 추가될 새로운 기능 구현

}

 

extension 확장할 타입 이름: 프로토콜 1, 프로토콜 2, 프로토콜 3 {

프로토콜 요구사항 구현

}

 

익스텐션으로 추가할 수 있는 기능

- 연산 타입 프로퍼티, 연산 인스턴스 프로퍼티

- 타입 메서드, 인스턴스 메서드

- 이니셜 라이저

- 서브 스크립트

- 중첩 타입

- 특정 프로토콜을 준수할 수 있도록 기능 추가

 

* 기존에 존재하는 기능을 재정의할 수는 없음

 

extension Int { // int 타입의 연산 프로퍼티 추가
    var isEven: Bool {
        return self % 2 == 0
    }
    var isOdd: Bool {
        return self % 2 == 1
    }
}

print(1.isEven) // false
print(2.isEven) // true
print(1.isOdd) // true
print(1.isOdd) // false

var number: Int = 3
print(number.isEven) // false
print(number.isOdd) // true

nuber = 2
print(number.isEven) // true
print(number.isOdd) // false

// 메서드 추가
extension Int {
    func multiply(by n: Int) -> Int {
        return self * n
    }
}
print(3.mutiply(by: 2)) // 6
print(4.mutiply(by: 5)) // 20

number = 3
print(number.mutiply(by: 2)) // 6
print(number.mutiply(by: 3)) // 9

// 이니셜 라이저 추가
extension String {
    init(intTypeNumber: Int) {
        self = "\(intTypeNumber)"
    }
    init(doubleTypeNumber: Double) {
        slef = "\(doubleTypeNumber)"
    }
}

let stringFromInt: String = String(intTypeNumber: 100)
// 100

let stringFromDouble: String = String(doubleTypeNumber: 100.0)
// 100.0