익스텐션은 스위프트에거 강력한 기능 중 하나로 구조체, 클래스, 열거형, 프로토콜 타입에 기능을 추가할 수 있는 기능이다.
타입을 수정하지 않아도, 타입의 구현된 내용을 몰라도 타입을 알고만 있다면 타입에 기능을 확장할 수 있는 것이다.
extension 확장할 타입 이름: 프로토콜1, 프로토콜2...{
// 추가할 기능 구현
}
익스텐션으로 추가할 수 있는 기능
- 연산 타입 프로퍼티 / 연산 인스턴트 프로퍼티
- 타입 메서드 / 인스턴스 메서드
- 이니셜라이저
- 서브스크립트
- 중첩 타입
- 특정 프로토콜을 준수하도록 기능 추가
extension Int {
var isEven: Bool {
return self % 2 == 0
}
var isOdd: Bool {
return self % 2 == 1
}
}
print(1.isOdd) //True
print(2.isEven) //True
print(3.isEven //False
Int의 구현 소스코드를 몰라도 프로퍼티를 추가할 수 있다.
extension Int {
func multiply(by: n: Int) {
return self * n
}
}
print(2.multiply(by: 3) // 6
메서드 역시 추가 가능하며 같은 타입에 익스텐션을 하더라도 반드시 같은 코드 블럭으로 할 필요는 없다.
extension String {
init(int: Int) {
self = "\(int)"
}
init(double: Double) {
self = "\(double)"
}
}
let stringFromInt: String = String(int: 100) // "100"
let stringFromDouble: String = String(double: 100.0) // "100.0"
인스턴스 초기화 시 다양한 데이터를 전달 받을 수 있도록 여러 종류의 이니셜라이즈를 추가하는 것이 가능하다.
// 익스텐션으로 클래스 타입에 편의 이니셜라이저는 추가할 수 있지만, 지정 이니셜라이저는 추가할 수 없습니다. 지정 이니셜라이저와 디이니셜라이저는 반드시 클래스 타입의 구현부에 위치해야 합니다(값 타입은 상관없습니다).
상속
- 가능 타입 : 클래스
- 수직 확장 = 하나의 타입을 물려받아 추가 기능을 구현
- 재정의 가능
익스텐션
- 가능 타입 : 구조체, 클래스, 프로토콜 등
- 수평 확장 = 기존 타입에 기능을 추가
- 재정의 불가능