본문 바로가기
etc/Swift

익스텐션(Extension)

by IT learning 2021. 5. 28.
728x90

 

오늘은 익스텐션에 대해 공부했다.

 

익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있는 기능이다. (혁신적이다. ㄹㅇ 개좋다)

기능을 추가하려는 타입의 구현된 소스 코드를 알지 못하거나 볼 수 없다고 해도, 타입만 알고 있다면 그 타입의 기능을 확장할 수도 있다.

 

익스텐션으로 추가 할 수 있는 기능

  • 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
  • 타입 메서드, 인스턴스 메서드
  • 이니셜라이저
  • 서브스크립트
  • 중첩 타입
  • 특정 프로토콜을 준수할 수 있도록 기능 추가

단, 기존에 존재하는 기능을 재정의할수는 없다.

 

정의

extension 확장할 타입 이름 {
    /* 타입에 추가될 새로운 기능 구현 */
}

// 익스텐션은 기존에 존재하는 타입이
// 추가적으로 다른 프로토콜을 채택할 수 있도록
// 확장할 수도 있습니다


 extension 확장할 타입 이름: 프로토콜 1, 프로토콜 2, 프로토콜 3... {
    /* 프로토콜 요구사항 구현 */
 }

위 코드처럼 사용하면 된다. 또한 익스텐션은 기존에 존재하는 타입이 추가적으로 다른 프로토콜을 채택할 수 있도록 확장할 수도 있다.

 

익스텐션 구현

 

- 연산 프로퍼티 추가

extension Int {
    var isEven: Bool {
        return self % 2 == 0
    }
    var isOdd: Bool {
        return self % 2 == 1
    }
}

print(1.isEven) // false
print(2.isEven) // true
print(1.isOdd)  // true
print(2.isOdd)  // false

var number: Int = 3
print(number.isEven) // false
print(number.isOdd)  // true

Int 형에 연산 프로퍼티를 추가했다.

획기적이지 않은가? 아 감동했다 ㄹㅇ ㅋㅋ

 

- 메서드 추가

extension Int {
    func multiply(by n: Int) -> Int {
        return self * n
    }
}

print(3.multiply(by: 2)) // 6
print(4.multiply(by: 5)) // 20

number = 3
print(number.multiply(by: 2)) // 6
print(number.multiply(by: 3)) // 9

메서드도 추가가 가능하다. 위 코드는 원래 숫자에 매개변수를 곱하는 코드이다. 대박인듯싶다. 이건 좀 ㄹㅇ 꿀인듯

 

- 이니셜라이저 추가

extension String {
    init(intTypeNumber: Int) {
        self = "\(intTypeNumber)"
    }
    
    init(doubleTypeNumber: Double) {
        self = "\(doubleTypeNumber)"
    }
}


let stringFromInt: String = String(intTypeNumber: 100)
// "100"

let stringFromDouble: String = String(doubleTypeNumber: 100.0)
// "100.0"

이니셜라이저를 추가해봤다. 위 코드는 입력받은 Int와 Double 입력 수를 String으로 변경하는 이니셜라이저이다.

 

2단원이 끝났다.

728x90

'etc > Swift' 카테고리의 다른 글

고차함수  (0) 2021.05.28
오류 처리  (0) 2021.05.28
프로토콜(Protocol)  (0) 2021.05.28
assert와 guard  (0) 2021.05.28
타입 캐스팅(Type Casting)  (0) 2021.05.28

댓글

IT_learning's Commit