- 기존에 선언되어 있는 타입에 새로운 기능을 추가할 때 사용
- 확장하려는 타입의 코드를 알지 못해도, 해당 타입의 기능 확장 가능 (타입 이름만 알면 됨)
extension SomeType {
// new functionality to add to SomeType goes here
}
☑️ 이니셜 라이저의 예
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
}
//이니셜라이저
extension Rect {
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
은Protocol
구현시에도 사용되는데,
아래와 같이Extension
과 Protocol
을 이용해 다중 상속처럼 사용할 수도 있다.
extension SomeType: SomeProtocol, AnotherProtocol {
// implementation of protocol requirements goes here
}
- 특정 작업이나 기능에 적합한 메서드, 속성 및 기타 요구 사항의 청사진
- 클래스, 구조체 또는 열거형에 채택해 사용
- Protocol도 하나의 data type임
- Protocol을 이용해 Delegate를 구현
// 구현 예
protocol SomeProtocol {
// protocol definition goes here
}
// 사용 예
struct SomeStructure: FirstProtocol, AnotherProtocol {
// structure definition goes here
}
☑️ 프로토콜 사용 예
protocol Readable {
func read()
}
protocol Writeable {
func write()
}
protocol ReadWriteSpeakable: Readable, Writeable {
func speak()
}
class someClass: ReadWriteSpeakable {
func speak() {
print("")
}
func read() {
print("")
}
func write() {
print("")
}
}