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()