-
[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