swift에선 클래스나 구조체, 열거형 타입에 대해서 확장(extension)을 지원한다.
확장을 이용하면 기존에 정의 된 타입들에 대해 새로운 기능을 추가 할 수 있는데 심지어 일반적으로 수정이 불가능하게 설정된 클래스나 구조체등에 확장을 해서 새로운 기능을 추가하는 것이 가능하다.
저장 프로퍼티는 확장이 불가능하다.
extension SomeType {
}
↳ 다음과 같은 형태로 확장을 선언한다.
extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
//"One inch is 0.0254 meters"
extension someClass {
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
746381295[0]
// returns 5
Int는 구조체로 정의 되어있기에 Int구조체를 확장한 예시이다.
extension Int {
func repetitions(task: () -> Void) {
for _ in 0..<self {
task()
}
}
}
3.repetitions {
print("Hello!")
}
// Hello!
// Hello!
// Hello!
extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.square()
// someInt is now 9
extension Int {
enum Kind {
case negative, zero, positive
}
}
Int 구조체에 Kind열거형을 내부에 중첩으로 추가 선언해 주었다.
extension SomeType: SomeProtocol, AnotherProtocol {
// implementation of protocol requirements goes here
}
↳ 프로토콜을 추가로 채택할 수 있다.
- 확장(extension)은 이미 만들어진 타입(클래스, 구조체, 열거형)에 기능을 추가하고 싶은때 사용하는 기능이다.
- 사용자 정의 타입뿐만 아니라 Int,Double등 이미 swift에 정의된 타입들의 확장도 가능하다.
- 저장 프로퍼티는 추가가 불가능하다.