확장
- 클래스, 구조체, 열거형 타입에 확장가능
- 새로운 메서드를 추가할수 있음 (계산속성, 메서드)
- 저장속성 확장 불가능
- 새로운 생성자 추가 가능 (클래스는 편의생성자만 가능)
- 프로토콜 채택 및 관련 메서드 구현은 확장에서 하는게 국룰임
protocol SomeProtocol {
}
class SomeClass { // 본체
let id: Int
let name: String
let age: Int
init(id: Int, name: String, age: Int) {
self.id = id
self.name = name
self.age = age
}
func doSomething() {
print("doSomething")
}
}
let someClass = SomeClass() // 확장에서 구현한 생성자로 인스턴스 생성
someClass.id // 1
someClass.age // 24
someClass.nextYearAge // 25
someClass.name // Jimin
someClass.doSomething()
someClass.doSomething2()
/*
콘솔:
doSomething
doSomething2
*/
extension SomeClass { // 확장
// var isStudent: Bool = true
// 확장에서 저장속성 추가는 불가능
var nextYearAge: Int {
return age + 1
} // 계산속성은 가능
func doSomething2() {
print("doSomething2")
} // 메서드도 가능
// 새로운 생성자 추가 가능
// 클래스는 편의생성자만 가능
// 편의생성자에서는 지정생성자를 호출해줘야함
// 값타입은 지정생성자 형태로도 생성자 구현 가능
convenience init() {
self.init(id: 1, name: "Jimin", age: 24)
}
}
// 프로토콜 채택 및 구현은 확장에서 하는게 국룰
extension SomeClass: SomeProtocol { }
애플 프레임워크 확장
- 애플에서 미리 만들어놓은 원본 소스코드에는 권한이 없다
- 하지만 확장을 이용해서 기능을 확장하는것은 가능하다
extension UIButton { // 애플에서 구현해놓은 UIButton 클래스
// 버튼의 레이블을 변경하는 메서드 확장으로 구현
func changeButtonLabel(_ label: String) {
self.setTitle(label, for: .normal)
}
}
let button = UIButton()
button.changeButtonLabel("이것이 버튼이다")