아리의 iOS 탐구생활

[Swift] Protocol 4) 이니셜라이저의 대한 요구사항 본문

Swift/문법

[Swift] Protocol 4) 이니셜라이저의 대한 요구사항

Ari Lee 2021. 8. 18. 18:12
반응형
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

 

Protocols — The Swift Programming Language (Swift 5.5)

Protocols A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of tho

docs.swift.org

 

반응형
Comments