구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있는 기능이다.
타입만 알고 있다면, 그 타입의 소스 코드를 모르더라도 기능을 확장할 수 있다.
⭐️ 익스텐션은 타입에 새로운 기능은 추가할 수 있지만, 기존에 존재하는 기능을 재정의할 수 없다.
익스텐션을 사용하는 대신에 원래 타입을 정의한 곳에서 추가하는 방법도 있지만,
외부 라이브러리나 프레임워크를 가져다 쓴다면 수정하지 못한다.
외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 때 익스텐션을 사용한다.
익스텐션 구현
연산 프로퍼티 추가
extension Int {
var isEven: Bool {
return self % 2 == 0
}
var isOdd: Bool {
return self % 2 == 1
}
}
print(1.isEven) // false
var number: Int = 3
print(number.isEven) // false
위의 익스텐션은 Int 타입에 두 개의 연산 프로퍼티를 추가했다.
메서드 추가
extension Int {
func multiply(by n: Int) -> Int {
return self * n
}
}
print(3.multiply(by: 2)) // 6
print(4.multiply(by: 5)) // 20
위 코드의 익스텐션을 통해 Int 타입에 인스턴스 메서드인 multiply 메서드를 구현했다.
여러 기능을 여러 익스텐션 블록으로 나눠서 구현하되
관련된 기능별로 하나의 익스텐션 블록으로 묶어주는 것도 좋다.