본문 바로가기
Swift/Language Guide

(작성중) Extension

by diosmio 2021. 9. 21.

extension은 이미 구현되어 있는 클래스, 구조체 등의 타입(+프로토콜)에 프로퍼티, 메소드를 추가하는 것이다

 

원본을 수정하지 않고 추가만 하게 되는데, 이를 Retroactive modeling이라고 표현한다고 한다.

그래서인지 원본 코드에 접근이 불가해도 extension은 가능하다

 

 Extension으로 추가할 수 있는 것들을 알아보자

  • computed 프로퍼티
  • 메소드
  • subscript
  • new Nested Type
  • 프로토콜 채택

🔹stored 프로퍼티는 extend할 수 없다

extension에 stored 프로퍼티가 가능하다면 타입이 요구하는 메모리 사이즈가 늘어난다

타입을 위한 메모리 사이즈를 정의하는 과정은 컴파일 타임에 이루어지는데 (효율성을 위해)

extension에 따라 사이즈가 가변적이라면 모든 module을 뒤져가며 extension 여부와 사이즈를 얼마나 늘릴지 확인해야 한다

그래서 막았다

https://www.reddit.com/r/swift/comments/7trzca/whats_the_reasoning_for_extensions_may_not/

자연히, stored 프로퍼티의 값이 변경됨을 감지하는 Property Observer (didSet/willSet)도 불가하다

 

 

 

Extension 구문

Protocol 두 개를 추가하는 예제

class Jang {
	...
}

extension Jang: ProtocolA, ProtocolB {
	// computed Properties
    	// methods
}

Protocol과 Generic을 추가하는건 추후에 자세히 다룰 예정이다

 

 

 

Computed 프로퍼티

표준 라이브러리의 타입인 Double에 computed 프로퍼티를 추가해보았다

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"

참고로, Swift 숫자 리터럴에 가독성을 위해 underscore( _ )를 사용할 수 있다

 

 

 

생성자

 

 

 

 

 

 

 

'Swift > Language Guide' 카테고리의 다른 글

(작성중) Concurrency  (0) 2021.09.19
Nested Types  (0) 2021.09.19
Inheritance (상속)  (0) 2021.09.18
Subscripts  (0) 2021.09.17
Enumerations(열거형)  (0) 2021.09.16

댓글