Swift랑 친해지기/Swift문법정리
[Swift] 프로토콜 (Protocol)
데브킹덕
2022. 9. 21. 16:57
프로토콜은 특정 작업이나 기능에 적합한 메서드, 속성 및 기타 요구 사항의 청사진을 정의함
⬇️
해당 요구 사항의 실제 구현을 제공하기 위해 클래스, 구조체, 열겨형에 의해 채택 될 수 있음
프로토콜의 요구사항을 충족하면?
해당 프로토콜을 준수한다고 정의함
프로토콜 정의 방법
protocol SomeProtocol {
프로토콜 정의를 적으셈
}
protocol SomeProtocol2 {
프로토콜 정의를 적으셈
}
구조체에서 프로토콜 채택방법
콜론(:)을 이용하여 이름 뒤에 프로토콜 이름을 배치하여 채택할 수 있음
쉼표(,)을 이용하여 여러개 나열 가능
struct SomeStructure: SomeProtocol, SomeProtocol2{
}
클래스에서 프로토콜 채택방법
슈퍼클래스를 상속하고 있는 경우에는 슈퍼클래스를 먼저 적어주고 나열해야함
class SomeClass: SomeSuperClass, SomeProtocol{
}
프로퍼티의 요구사항
프로토콜은 이름과 유형을 가진 인스턴스 속성 또는 타입 프로퍼티를 제공하기 위해 유형을 요구함
프로토콜을 저장프로퍼티나 연산프로퍼티를 명시하지 않고 필요한 프로퍼티 속성과 이름만 지정함
속성 요구 사항은 항상 var키워드 변수 속성으로 선언
get 읽기만 가능한 프로퍼티 - age
get set 읽기, 쓰기 가능한 프로퍼티 - name
protocol SomeProtocol{
var name: String {get set}
var age : Int {get}
}
타입 프로퍼티를 요구하려면 static 접두사 사용
protocol AnotherProtocol {
static var someTypeProperty: Int {get set}
}
메서드의요구사항
- 인스턴스 메서드와 타입 메서드를 정의할 수 있음
- 하지만 메서드 파라미터의 기본값을 프로토콜 안에서 사용불가능
- 메서드를 정의할 때 함수명, 반환값 지정 할 수 있고 {}는 적지 않음
- mutating 키워드를 사용해 인스턴스에서 변경 가능하다는 것을 표시 할 수 있음 (값 타입에서만 사용 가능)
protocol Fullyname {
static func printFullname()
func printname(name: String) -> String
mutating func printingLastname()
}
초기화 요구사항
프로토콜에서 이니셜라이저 정의 가능
생성자 키워드와 매개변수 정해주면 됨
protocol SomeProtocol{
init(somParameter: Int)
}
SomeProtocol 이라는 프로토콜에서 특정 이니셜라이저가 필요하다고 명시했기 떄문에
구현시 required 키워드를 붙여 해당 이니셜라이저를 초기화 해주어야함
class SomeClass: SomeProtocol{
required init(somParameter: Int){
}
}
SomeProtocol의 required 이니셜라이저를 구현하고, 슈퍼클래스의 이니셜라이저를
서브클래스에 상속하는 경우 서브클래스의 이니셜라이저 앞에 required 키워드와 override를 붙여줘야함
protocol SomeProtocol{
init()
}
class SomeSuperCalss{
init(){
}
}
class SomeSubClass: SomeSuperClass, SomeProtocol{
required override init(){
}
}