일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- init
- url
- property
- struct
- enum
- Class
- 디자인패턴
- UIKit
- instance
- initializer
- tuist
- Unicode
- String
- type
- interpace
- Protocol
- 코딩테스트
- Method
- Terminal
- IOS
- 스위프트
- Swift
- Git
- Xcode
- initalizer
- 이니셜라이저
- Foundation
- delegate
- extension
- optional
Archives
- Today
- Total
아리의 iOS 탐구생활
[Swift] Protocol 4) 이니셜라이저의 대한 요구사항 본문
반응형
Initializer Requirements
🔍 구조체와 클래스에서 생성자 구현의 차이
구조체는 Memberwise Initializers를 통해 프로토콜 요구사항을 충족시킬 수 있다. 직접 이니셜라이저를 구현해줘도 상관없다.
클래스는 상속을 고려해야하고 모든 서브클래스에서 프로토콜의 요구사항을 충족시켜야 한다. 그래서 클래스에서는 required initializer로 선언해야 한다.
protocol Test {
var name: String { get }
init(name: String)
}
//struct A: Test {
// var name: String // Memberwise Initializers를 통해 프로토콜 요구를 충족시킨다.
//}
struct A: Test {
var name: String
init(name: String) {
self.name = name
}
}
class B: Test {
var name: String
required init(name: String) { // required initializer로 구현
self.name = name
}
}
🔍 final 클래스에서 프로토콜 구현
final class에서는 required키워드를 추가하지 않아도 프로토콜의 요구사항을 충족시킨다.
왜냐하면 더이상 상속되지 않기 때문에 상속을 고려할 필요가 없다.
final class C: Test {
var name: String
init(name: String) { // 기본 initializer로 구현
self.name = name
}
}
🔍 상속과 중복 선언 오류
//class D: B, Test {
// // 이미 슈퍼클래스가 프로토콜 요구사항을 상속하고 있기 때문에 다시 Test를 채택하는 것은 중복이다.
// // 이런건 문법적으로 허용되지 않는다. 오히려 중복선언 때문에 에러가 발생한다.
//}
class D: B {
var age: Int
init() { // 프로토콜 요구사항을 충족시키지 못하는 생성자
age = 7
super.init(name: "ari")
}
// 따라서 프로토콜과 동일한 생성자를 구현해야한다.
required convenience init(name: String) {
self.init()
}
// 꼭 convenience init로 구현하지 않아도 프로토콜 요구사항을 충족시킨다.
// 다만 required 키워드는 필요하다.
}
🔍 Non-failable Initializer와 Failable Initializer
optional과 non-optional은 서로 다른타입이기 때문에 프로토콜의 요구사항을 충족시키지 못한다.
protocol NonFailable {
init(test: Double) // non-optional 인스턴스를 생성.
}
struct E: Failable {
init?(test: Double) { // optional 인스턴스를 생성. 에러발생!
}
}
여기서 물음표를 느낌표로 바꾸게되면 프로토콜의 요구사항은 충족시키지만 초기화에 실패한 경우에는 런타임 에러가 발생할 수 있다.
반면에 Failable Initializer는 Non-failable Initializer와 Failable Initializer 모두 요구사항을 충족시킨다.
protocol Failable {
init?(test: Double) // optional 인스턴스를 생성.
}
struct F: Failable {
init? (test: Double) { // !도 ?도 아예 없어도 문제없다.
}
}
✔️ Reference
반응형
'Swift > 문법' 카테고리의 다른 글
[Swift] Protocol 6) 프로토콜의 확장을 알아보자 (0) | 2021.08.18 |
---|---|
[Swift] Protocol 5) 타입에 대하여... (0) | 2021.08.18 |
[Swift] Protocol 3) 메소드의 대한 요구사항 (0) | 2021.08.18 |
[Swift] Protocol 2) 속성(Property)의 대한 요구사항 (0) | 2021.08.18 |
[Swift] Protocol 1) 기본 개념 (0) | 2021.08.18 |
Comments