익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있다. 기능을 추가하려는 타입을 구현한 소스 코드를알지 못하거나 볼 수 없다 해도, 타입만 안다면 그 타입의 기능을 확장할 수 있다.
그러나 기존에 존재하는 기능을 재정의할 수는 없다.
위기능을 추가 할 수 있다.
extension 확장할 타입 이름 {
타입에 추가될 새로운 기능 구현
}
extension 확장할 타입 이름: 프로토콜1, 2, 3 {
프로토콜 요구사항 구현
}
extension Int {
var isEven: Bool {
return self % 2 == 0
}
var isOdd: Bool {
return self % 2 == 1
}
print(1.isEven) // fasle //숫자로 넣어도 됨
var number: Int = 3
print(number.isEven) //false
extension Int {
func multiply(by n: Int) -> Int {
return self * n}
.
.
.
}
타입의 정의 부분에 이니셜라이저를 추가하지 않더라도 익스텐션을 통해 이니셜라이저를 추가할 수 있다.
클래스 타입에 편의 이니셜라이저는 추가가 가능하지만, 지정 이니셜라이저는 추가가 불가능하다.
extension String {
init(intTypeNumber: Int) {
self = "\(intTypeNumber)"
}
init(doubleTypeNumber: Double) {
self = "\(doubleTypeNumber)"
}
}
extension String {
subscript(addValue: String) -> String {
return self + appedValue
}
.
.
.
}
이외에도 중첩 데이터 타입을 추가할 수도 있다. (후에 배움)