reference : https://blog.yagom.net/529 야곰넷, 스위프트 공식 문서, https://velog.io/@zooneon
- 익스텐션은 스위프트의 강력한 기능 중 하나.
특히 프로토콜과 함께 사용하면 굉장히 강력한 기능을 선사한다.
-> 프로토콜 지향 프로그래밍- 익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에 기능을 추가할 수 있는 기능
- 기본 타입의 기능을 확장할 수도 있다.
- 스위프트 익스텐션이 타입에 추가할 수 있는 기능들
- 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
- 메서드
- 이니셜라이저
- 서브 스크립트
- extension 에서 연산 프로퍼티는 사용 가능하지만, 저장 프로퍼티는 사용 불가능하다.
- 클래스의 상속은 클래스 타입끼리만 가능하지만 익스텐션은 클래스, 구조체, 열거형, 기본 타입등 적용 가능한 범위가 더 넓다.
- 클래스의 상속은 super class / sub class 의 계급이 나뉜 수직 구조 이지만 익스텐션은 기존의 기능을 확장하는 수평구조 를 이룬다.
- 클래스의 상속은 특정 타입을 물려받아 새로운 타입을 새로 정의 하는 것이지만 익스텐션은 타입을 새로 정의하는 것이 아니라 기존 타입의 확장이다.
- 상속을 받으면 기존 기능을 재정의 할 수 있지만, 익스텐션으로는 기존 기능을 재정의 할 수는 없다.
Swift 익스텐션 문법
extension 확장할 타입 이름 { // 타입에 추가될 새로운 기능 구현 } extension 확장할 타입 이름: 프로토콜1, 프로토콜2, 프로토콜3 { // 프로토콜 요구사항 구현 }
- Int 타입에 isEven 이라는 boolean 연산 프로퍼티 추가
// 1. 연산 프로퍼티 익스텐션 extension Int { var isEven: Bool { return self % 2 == 0 } } 26.isEven // true 29.isEven // false
- String 타입에 show() 라는 메서드 추가
// 2. 메서드 익스텐션 extension String { func show() { print(self) } } "Hello".show() // "Hello
- String 타입에 Int 형 자료를 이니셜라이저 하면 문자열 타입으로 바꿔주는 기능 추가
- class Person 타입에 편의 이니셜라이저 추가
// 3. 이니셜라이저 extension String { init(number: Int) { self = "\(number)" } } let six: String = String(6) six // "6" // 클래스 타입은 편의 이니셜라이저만 익스텐션 할 수 있다. class Person { var name: String init(name: String) { self.name = name } } extension Person { convenience init() { self.init(name: "Default") } } let someone: Person = Person() someone.name // -> Default
- 서브 스크립트 (subscript)
클래스, 구조체, 열거형에서 시퀀스의 멤버 요소에 접근하기 위한 바로가기 첨자로, 단일 타입에 여러 서브스크립트를 정의할 수 있다.
예를들어 array[3] 의 대괄호, dictionary[key] 의 대괄호.// 4. 서브 스크립트 // 타입에 서브 스크립트 익스텐션 하기 extension String { subscript(value: String) -> String { return self + value } subscript(repeatCount: Int) -> String { var str: String = "" for _ in 1...repeatCount { str += self } return str } } print("abc"["def"]) //abcdef print("abc"[3]) //abcabcabc