Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- enum
- Realm
- 독학
- 열거형
- 문자열 보간법
- Optional Chaining
- 기본문법
- TableView
- cancelAsyncWrite
- 옵셔널 체이닝
- Git
- 직장인인강
- 직장인자기계발
- Threading
- userDefaults
- 인스펙터
- ios
- Background
- swift
- RawValue
- beginAsyncWrite
- 함수
- 패스트캠퍼스
- switch
- 패스트캠퍼스후기
- SeSAC
- 프로퍼티 관찰자
- xcode
- 30개프로젝트로배우는iOS앱개발withSwift초격자패키지Online
- 패캠챌린지
Archives
- Today
- Total
아삭아삭 iOS 개발
[Swift 독학] 패스트캠퍼스 챌린지 30일차_익스텐션 본문
오늘은 스위프트의 강력한 기능 중 하나인 확장(익스텐션, extension)에 대해 알아보겠습니다.
재정의를 하지 않고도 기존 타입에 새로운 기능을 추가할 수 있어 매우 유용한 기능인 확장의 특징과 추가 가능한 기능들은 아래와 같습니다.
반응형
■ 확장 (익스텐션, extensions)
- 기존의 클래스, 구조체, 열거형, 프로토콜 타입에 새로운 기능을 추가하는 기능
※ 단, 기존에 존재하던 기능을 재정의(=오버라이드) 할 수는 없음 - 익스텐션 키워드를 사용하여 적용
- 타입만 알고도 그 타입의 기능 확장 가능
※ 단, 기능을 추가하려는 타입의 구현된 소스 코드를 모르거나 알 수 없어도 가능 - 익스텐션은 구조체, 클래스, 프로토콜 등에 적용 가능
※ 반면 클래스의 상속은 클래스 타입에서만 가능 - 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 경우에 사용
ex) 외부 라이브러리나 프레임워크를 가져다 썼을 때는 원본 소스를 수정하지 못함 - 익스텐션을 통해 연산 프로퍼티/메서드/이니셜라이저/서브스크립트/중첩 데이터 타입 등 추가 가능
- 프로토콜과 함께 사용할 경우 강력한 기능을 제공함
extension 확장할 타입 {
// 타입에 추가될 새로운 기능 구현 //
}
extension 확장할 타입: 프로토콜1, 프로토콜2, 프로토콜3 {
// 프로토콜 요구사항 구현 //
}
■ 익스텐션이 타입에 추가할 수 있는 기능
- 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
※ 단, 저장 프로퍼티는 추가할 수 없음, 타입에 정의되어 있는 기존 프로퍼티의 감시자를 추가할 수 없음
extension Int {
var isPositive: Bool {
return self > 0
}
var isNegative: Bool {
return self < 0
}
}
var covidTestResult = -2
covidTestResult.isPositive
// false
covidTestResult.isNegative
// true
var colleagueResult: Int = 5
print(colleagueResult.isPositive)
// true
- 타입 메서드 / 인스턴스 메서드
// Int타입에 인스턴스 메서드인 cubemultipleN(by: ) 메서드를 추가
extension Int {
func cubemultipleN(by n: Int) -> Int {
return self * self * self * n
}
}
print(2.cubemultipleN(by: 1))
// 8
print(3.cubemultipleN(by: 2))
// 54
var apartmentarea = 5
print(apartmentarea.cubemultipleN(by: 2))
- 이니셜라이저(초기화 구문)
- 타입의 정의부에 초기화 구문을 추가하지 않더라도 익스텐션을 통해 이니셜라이저 추가 가능
- 익스텐션으로 클래스 타입에 현의 이니셜라이저 추가 가능
※ 단, 지정 이니셜라이저는 추가 불가
※ 지정 이니셜라이저와 디이니셜라이저는 반드시 클래스 타입의 구현부에 위치해야 함
- 값 타입은 무관
extension String {
init(double: Double) {
self = "\(double)"
}
init(bool: Bool) {
self = "\(bool)"
}
}
let stringFromDouble: String = String(double: 99.9999)
// "99.999"
let stringFromBool: String = String(bool: true)
// "true"
- 서브스크립트
- 중첩 타입
- 특정 프로토콜을 준수할 수 있도록 기능 추가
■ 클래스의 상속 vs. 익스텐션
클래스의 상속 | 익스텐션 | |
적용범위 | 클래스 타입 | 구조체/클래스/열거형/프로토콜/제네릭 타입 등 |
확장의 성격 | 수직 확장 : 특정 타입을 물려받아 하나의 새로운 타입을 정의하고 추가 기능을 구현 |
수평 확장 : 기존의 타입에 기능을 추가하는 수평 확장 |
재정의 가능여부 | 기존 기능 재정의 가능 | 기존 기능 재정의 불가 |
본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.
■ fast campus강의 외 참조자료
[1] https://blog.yagom.net/563/
[2] https://bbiguduk.gitbook.io/swift/language-guide-1/extensions
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Swift' 카테고리의 다른 글
[Swift 독학] 패스트캠퍼스 챌린지 32일차_열거형(2) (0) | 2022.02.24 |
---|---|
[Swift 독학] 패스트캠퍼스 챌린지 31일차_열거형(1) (0) | 2022.02.23 |
[Swift 독학] 패스트캠퍼스 챌린지 29일차_프로토콜 (0) | 2022.02.21 |
[Swift 독학] 패스트캠퍼스 챌린지 28일차_assert와 precondition과 guard (0) | 2022.02.20 |
[Swift 독학] 패스트캠퍼스 챌린지 27일차_타입캐스팅 (0) | 2022.02.19 |