iOS/Swift

[Swift] 익스텐션(extension)

year.number 2022. 9. 3. 17:41

 

익스텐션이란?

  • 타입을 나눠서 작성하고, 하나의 타입으로 동작하는 것
  • 기존에 작성된 타입이나 남이 작성한 타입을 확장할 수 있다
  • 서로 다른 파일에 작성 가능하다

 

class Dog {
   func eat() {
      print("밥먹기")
   }
}

// 확장

extension Dog {
   func growl() {
      print("으르렁")
   }
}

var myDog = Dog()
myDog.eat()  // 원래 클래의 메서드
myDog.bike() // 확장한 클래스의 메서드

 

익스텐션으로 가능한 것

계산 프로퍼티, 메서드, 프로토콜, 서브스크립트, 중첩 타입, ...

 

불가능한 것

designated initializer, 저장 프로퍼티

 


extension과 프로퍼티

- 계산 프로퍼티 가능 (designated initializer의 영향을 받지 않기 때문)

- 저장 프로퍼티 불가능

 

extension Dog {

   // 계산 프로퍼티
   var everageLife: Int! {
      return 15
   }
   
   // 저장 프로퍼티
   var color: String! // 에러
}

 

 


extension과 이니셜라이져

- designated initializer 추가 불가

- convenience initializer 추가 

 

class Cat {

   // designated initializer
   init() {}
}

extension Cat {
   convenience init(name: String) {
      self.init()
   }
}

 


extension과 프로토콜

 

extension 내에서 프로토콜 채택 구현

- 프로토콜 내에 이니셜라이저가 없어야 한다

 

다중 상속과 비슷한 효과를 얻을 수 있는 것이 특징

 

- 구조체/열거형 사용 시에 중복 코드 문제를 해결할 수 있다- 프로토콜의 extension은 약속의 의미로써 프로토콜와 기본 동작으로서의 구현이 결합된 상태이다

 

protocol Jumping {
   func jump()
}

extension Dog: Jumping {
   func jump() {
      print("높이뛰기")
   }
}

 

protocol Singing {
   func sing()
}

class Bird: Singing {
   func sing() {
      print("a bird sings a song")
   }
}

strunct Cat: Singing {
   func sing() {
       print("a cat sings a song")
   }
}

extension Singing {
   func fly() {
      print("and flies to the sky")
   }
}

let sparrow = Bird()
sparrow.sing()
sparrow.fly()