본문으로 바로가기

[Swift] 확장 (extension)

category Swift/문법 2022. 4. 10. 13:15

확장

- 클래스, 구조체, 열거형 타입에 확장가능

- 새로운 메서드를 추가할수 있음 (계산속성, 메서드)

- 저장속성 확장 불가능

- 새로운 생성자 추가 가능 (클래스는 편의생성자만 가능)

- 프로토콜 채택 및 관련 메서드 구현은 확장에서 하는게 국룰임

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("이것이 버튼이다")