大器晩成

[Protocols] 생성자 본문

iOS/Swift 문법

[Protocols] 생성자

zerobugpark 2025. 1. 23. 01:57

 

[생성자 요구사항] 

  • 클래스는 상속을 고려해야 하며, 생성자 앞에 required를 붙여야 합니다.
  • 구조체는 상속이 없기 때문에, required키워드가 따로 필요 없습니다.
  • 클래스의 final을 붙여서 상속이 없다는 것을 명시하면, required를 생략할 수 있습니다.
  • 클래스에서는 지정생성자 또는 편의생성자로 구현이 가능합니다.
  • 실제 프로젝트에서 사용하는 경우는 드뭅니다.

 

 

Apple 공식문서

protocol SomeProtocol {
    init(someParameter: Int)
}


class SomeClass: SomeProtocol {
    required init(someParameter: Int) {
        // initializer implementation goes here
    }

}

class SomeSubClass: SomeClass {
    // 하위 클래스에서 생성자를 구현 안하면 필수 생성자는 자동으로 상속됩니다.
//    required init(someParameter: Int) {
//        // initializer implementation goes here
//    }
}

let a = SomeClass(someParameter: 10)


// 구조체에는 Required 생략 가능
struct StructSomeClass: SomeProtocol {
    init(someParameter: Int) {
        // initializer implementation goes here
    }

}
  • required 키워드를 사용하여 클래스의 모든 하위 클래스에 필수 생성자를 구현할 수 있도록 명시적으로 안내

final 키워드 활용

protocol SomeProtocol {
    init(someParameter: Int)
}


final class SomeClass: SomeProtocol {
    init(someParameter: Int) {
        // initializer implementation goes here
    }

}
  • final 클래스는 상속을 할 수 없기 때문에, required 키워드를 사용할 필요가 없습니다.

지정 생성자가 아닌 편의생성자로 구현

protocol SomeProtocol {
    init(someParameter: Int)
}

class SomeClass: SomeProtocol {
    init() {
        
    }
    required convenience init(someParameter: Int) {
        self.init()
    }
    

}

프로토콜과 상속 

protocol Remote {
    init()
}

class TV {
    init() {
        
    }
}


class SmartController: TV, Remote {

    required override init() {
        
    }
}

 

  • 상속으로 인한 재정의 (override) 및 Remote 프로토콜 채택으로 발생한 required 키워드 둘 다 필요합니다.

 

프로토콜에서의 실패가능생성자

  • 실패가능 생성자를 선언 시 -> init() / init?() / init!() 모두 구현이 가능합니다.
  • 실패불가능 생성자 선언 시 -> init?()으로 구현은 불가능합니다.
//실패 가능
protocol Remote {
    init?()
}

struct SmartController: Remote {

    //init?() {}
    init() {}
    //init!() {}
}


//실패 불가능
protocol Remote {
    init()
}

struct SmartController: Remote {

    init() {}
}
728x90