ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] 익스텐션(extension)
    iOS/Swift 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()

     

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

    [Swift] 객체 지향 프로그래밍  (0) 2022.09.01
    [Swift] 프로토콜(protocol)  (0) 2022.08.31
    [Swift] 타입캐스팅(type casting)  (0) 2022.08.24
    [Swift] 상속 (Inheritance)  (0) 2022.08.22
    [Swift] 서브스크립트(subscript)  (0) 2022.08.20
Designed by Tistory.