Swift/swift 문법

확장에서의 생성자 사용

Lyla. 2023. 3. 29. 00:22

클래스 - 편의생성자만 구현 가능하다. 

              (self.키워드로 생성자 지정)

              델리게이트 어크로스 : 편의생성자는 궁극적으로 지정생성자를 호출해야한다 

// 참고 : 상속에서의 생성자 위임 규칙
1) 델리게이트 업 : 지정생성자는 슈퍼클래스의 지정생성자를 반드시 호출해야한다
2) 델리게이트 어크로스 : 편의생성자는 궁극적으로 지정생성자호출해야한다

구조체 - 지정생성자 형태로도 구현 가능하다.(자유)

 

import Foundation

class Aclass {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
    
    convenience init() {
        self.init(x: 0, y: 0)
    }
}

class Bclass: Aclass {

    var z: Int
    
    init(z:Int){
        self.z = z
        super.init(x: x, y: y)
    }

    override convenience init(x: Int, y: Int) {
      
        //편의 이니셜라이저는 값을 할당하기 전에 다른 이니셜라이저를 호출해야함
        self.init()
        self.z = 0
       
    }

}



class Cclass: Aclass {
    var z : Int
    
    //지정생성자
    init(x: Int, y: Int, z: Int) {
        self.z = z
        super.init(x: x, y: y)
    }
    
    //생성자 재정의
    override convenience init(x: Int, y: Int) {
        //지정생성자 호출 -> 편의생성자
        self.init(x: 0, y: 0, z: 0)
    }
}

extension Cclass {
    convenience init(x: Int) {
        
        //확장에서는 self키워드로 자신의 init을 가져와서 써야한다.(클래스)
        self.init(x: x, y: 0)
    }
}