Notice
Recent Posts
Recent Comments
Link
大器晩成
[Protocols] 생성자 본문
[생성자 요구사항]
- 클래스는 상속을 고려해야 하며, 생성자 앞에 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
'iOS > Swift 문법' 카테고리의 다른 글
[프로토콜] - 타입으로서 프로토콜 (Protocols as Types) (0) | 2025.02.09 |
---|---|
[프로토콜] - 서브스크립트 (0) | 2025.02.06 |
[Protocols] 프로토콜 요구사항 (0) | 2025.01.12 |
[Protocols] 프로토콜(Protocol) (0) | 2025.01.09 |
[Extensions] 멤버의 확장(중첩타입, Nested Types) (0) | 2025.01.07 |