티스토리 뷰
Extensions은 기존에 있던 클래스 구조체 열거형 또는 프로토콜 타입에 새로운 기능을 추가할 수 있습니다. Objective-C의 categories와 유사하며 오리지널 소스 코드와는 별개로 다른 곳에서도 덧붙여서 기능을 연장할 수 있습니다.
스위프트의 Extensions이 할 수 있는 것들
- 연산 인스턴스/타입 프로퍼티 추가
- 인스턴스/타입 메소드 정의
- 새로운 초기자(이니셜라이저) 제공
- 서브스크립트 정의
- 새로운 중첩 타입들 정의 및 사용
- 프로토콜 준수
익스텐션은 오버라이딩을 할 수 없음.
Extension Syntax
extension SomeType {
// new functionality to add to SomeType goes here
}
extension SomeType: SomeProtocol, AnotherProtocol {
// implementation of protocol requirements goes here
}
Computed Properties
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")
// Prints "One inch is 0.0254 meters"
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
// Prints "Three feet is 0.914399970739201 meters"
5가지 단위를 표현할 수 있는 연산 프로퍼티를 선언함.
익스텐션은 저장 프로퍼티나 존재하는 프로퍼티에 프로퍼티 옵서버 추가같은 건 할 수 없음
Initializers
클래스의 경우 convenience 이니셜라이저를 추가할 수 있으나 designated 이니셜라이저나 디이니셜라이저는 추가할 수 없음.
이 친구들은 오리지널 클래스 구현부에 구현되어야 하는 친구들이기 때문에. 값 타입의 인스턴스를 추가하기 위해 익스텐션을 사용하고 그 값타입이 모든 프로퍼티에 기본값을 제공하고 커스텀 이니셜라이저를 정의하지 않았다면 기본 이니셜라이저와 멤버와이즈 이니셜라이저를 익스텐션에서 사용할 수 있다.
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()
}
let defaultRect = Rect()
let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0),
size: Size(width: 5.0, height: 5.0))
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)
//self.init으로 멤버와이즈 이니셜라이저 사용
}
}
Methods
개요에 설명한 것과 같이 별 특이사항 없고 mutating 메소드로 값 타입 내부 프로퍼티 변경도 가능하다 정도
Subscripts
메소드처럼 특별한 건 없고 예제가 쓸만해보임. 자리수를 반환하는 Int 타입 익스텐션
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
746381295[0]
// returns 5
746381295[1]
// returns 9
746381295[2]
// returns 2
746381295[8]
// returns 7
Nested Types
얘도 별다른 것 없다. 예제만 보고 가자
extension Int {
enum Kind {
case negative, zero, positive
}
var kind: Kind {
switch self {
case 0:
return .zero
case let x where x > 0:
return .positive
default:
return .negative
}
}
}
'Swift Language Guide' 카테고리의 다른 글
Generics(제네릭) (0) | 2020.11.30 |
---|---|
Protocols(프로토콜) (0) | 2020.11.26 |
타입 캐스팅 + 중첩 타입 (0) | 2020.11.24 |
Error Handling(에러 핸들링) (0) | 2020.11.19 |
Optional Chaining(옵셔널 체이닝) (0) | 2020.11.18 |
댓글