반응형
익스텐션을 이용해 클래스, 구조체, 열거형, 프로토콜 등
모든 타입에 기능을 추가할 수 있습니다.
심지어 원본 코드를 몰라도 타입만 알고있다면 기능을 확장할 수 있습니다.
참고로, 기능은 추가가 가능해도 override는 불가합니다!
익스텐션을 이용해 가능한 기능들은 다음과 같습니다.
- 계산된 인스턴스/타입 프로퍼티의 추가
- 인스턴스/타입 메소드 추가
- 새로운 이니셜라이저 제공
- 서브스크립트 정의
- 중첩타입의 선언과 사용
- 특정 프로토콜을 따르는 다입 만들기
추가로, 익스텐션은 외부 라이브러리나 프레임워크에 대해도 사용할 수 있습니다.
특히, 프로토콜과 함께 사용한다면 굉장히 강력한! 기능이라고 하니
이는 나중에 또 공부해서 포스팅 해보도록 하겠습니다.
정의
extension TypeName {
//구현부
}
//다중 프로토콜 상속이 가능합니다.
extension TypeName: Procotol1, Procotol2, Procotol3... {
//구현부
}
익스텐션 구현
연산 프로퍼티 추가
extension Int{
var isPrime: Bool{
if self < 2 { return false }
for i in 2...self - 1{
if self % i == 0 { return false }
}
return true
}
}
print(1.isPrime) // false
print(5.isPrime) // true
print(12.isPrime) // false
var num = 80
print(num .isPrime) // false+
익스텐션을 활용해 Int타입에 소수를 판별하는 연산 프로퍼티를 추가해보았습니다.
메서드 추가
extension Int{
var isPrime: Bool{
if self < 2 { return false }
for i in 2...self - 1{
if self % i == 0 { return false }
}
return true
}
/**
입력된 option에 따라 가까운 소수를 찾아서 반환합니다.
- Parameter option : 0이면 자기보다 큰 소수를, 1이면 자기보다 작은 소수를 찾습니다.
- Throws : 2보다 작은 수를 입력시 0을 반환합니다.
*/
func nearPrime(option : Int) -> Int {
var temp: Int = self
if temp.isPrime{ return temp }
switch option {
case 0:
while(temp > 2){
temp += 1
if temp.isPrime { return temp }
}
case 1:
while(temp > 2){
temp -= 1
if temp.isPrime { return temp }
}
default:
return 0
}
return 0
}
}
print( 1.nearPrime(option: 0) ) //0
print( 9.nearPrime(option: 0) ) //11
print( 9.nearPrime(option: 1) ) //7
print( 16243.nearPrime(option: 0) ) //16249
print( 16243.nearPrime(option: 1) ) //16231
print( 11.nearPrime(option: 0) ) //11
print( 11.nearPrime(option: 1) ) //11
이어서, Int타입에 인스턴스 메서드 nearPrime(option:)을 추가해보았습니다.
활용해보니까 재밌고 신기하네요 ㅎ
이니셜라이저 추가
extension String {
init(int: Int) {
self = "\(int)"
}
init(double: Double) {
self = "\(double)"
}
}
let stringFromInt: String = String(int: 100)
// "100"
let stringFromDouble: String = String(double: 100.0)
// "100.0"
마땅한 예를 못만들겠어서.. 제가 본 예제 그대로 작성해보았습니다.
단, 클래스 타입의 지정 이니셜라이저와 디이니셜라이져는 추가 할 수 없습니다.!
저장프로퍼티 추가는 불가능
class Pet {
var name: String
var species: String
init(name: String, species: String){
self.name = name
self.species = species
}
}
extension Pet {
var owner: String
init(name: String, species: String, owner String){
self.name = name
self.species = species
self.owner = owner
}
}
//error: extensions must not contain stored properties var owner: String
공부에 도움을 준 사이트
전반적인 공부 가이드라인
야곰닷넷 - yagom.net
iOS 개발자들의 놀이터, 배움터, 모임터, 기록보관소 야곰닷넷입니다.
yagom.net
스위프트 공식 가이드 번역 사이트
https://jusung.gitbook.io/the-swift-language-guide/language-guide/20-extensions
익스텐션 (Extensions)
jusung.gitbook.io
반응형
'Language > Swift' 카테고리의 다른 글
Swift 고차함수 (0) | 2021.03.15 |
---|---|
Swift 오류처리 (0) | 2021.03.15 |
Swift 프로토콜 기초 (0) | 2021.03.14 |
Swift Assert와 Guard (0) | 2021.03.14 |
Swift 타입캐스팅 (형변환) (0) | 2021.03.13 |