- swift에 대해 공부한 내용을 정리한 글입니다.
- 해당 글은 한빛미디어의 스위프트 프로그래밍 3판을 참고하여 작성했습니다.
익스텐션은 스위프트의 강력한 기능 중 하나로 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있다. 기능을 추가하려는 타입을 구현한 소스 코드를 알지 못하거나 볼 수 없다고 해도, 타입만 안다면 그 타입의 기능을 확장할 수 있다.
익스텐션이 타입에 추가할 수 있는 기능은 다음과 같다.
익스텐션은 타입에 새로운 기능을 추가할 수는 있지만, 기존에 존재하는 기능을 재정의할 수는 없다.
클래스의 상속과 익스텐션을 비교해보자. 이 둘은 비슷해보이지만 실제로는 많이 다르다. 클래스의 상속은 클래스 타입에서만 가능하지만 익스텐션은 클래스를 포함해 구조체, 프로토콜 등에 적용할 수 있다. 이 밖의 다른 점들은 아래의 표를 참고하자.
상속 | 익스텐션 | |
---|---|---|
확장 | 수직확장 | 수평확장 |
사용 | 클래스 타입에서만 사용 | 클래스, 구조체, 프로토콜, 제네릭 등 모든 타입에서 사용 |
재정의 | 재정의 가능 | 재정의 불가 |
익스텐션은 extension
키워드를 사용해 정의한다.
extension 확장할 타입 이름 {
기능 구현
}
extension 확장할 타입 이름: 프로토콜1, 프로토콜2 {
기능 구현
}
익스텐션을 통해서 타입에 연산 프로퍼티를 추가할 수 있다.
extension Int {
var isEven: Bool {
return self % 2 == 0
}
var isOdd: Bool {
return self % 2 != 0
}
}
var number = 1
print(number.isEven)
print(number.isOdd)
false
true
변수 number이 홀수이므로 각각 false와 true가 출력되었다.
참고로 익스텐션으로 연산 프로퍼티를 추가할 수는 있지만, 저장 프로퍼티는 추가할 수 없다. 또, 타입에 정의되어 있는 기존의 프로퍼티에 프로퍼티 옵저버를 추가할 수도 없다.
익스텐션을 통해서 타입에 메서드를 추가할 수 있다.
extension String {
func convertToInt() -> Int? {
return Int(self)
}
}
var string = "0"
print(string.convertToInt())
0
변수 string이 문자에서 정수로 바뀐 것을 알 수 있다.
이 밖에도 서브스크립트나 이니셜라이저의 기능을 확장할 수 있다.