[Protocol] 애플 개발자 문서 정리
이 글은 아래 링크를 보고 나름대로의 해석을 거쳐 정리된 문서입니다. ~ !
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/protocols/
Documentation
docs.swift.org
서문
프로토콜은 특정 작업이나 기능에 적합한 메서드, 속성 및 기타 요구사항들의 청사진을 의미합니다.
클래스, 구조체, 또는 열거형은 이러한 프로토콜을 채택하여 요구사항들을 실제로 구현합니다. 프로토콜의 요구사항을 만족시키는 모든 타입으은 해당프로토콜을 준수한다고 말할 수 있습니다.
프롵모콜을 확장하여 일부 요구사항들을 구현하거나 준수하는 타입들이 이용할 수 있는 추가 기능을 구현할 수도 있습니다.
프로토콜 구문
프로토콜은 클래스,구조체 열거형과 매우 유사한 방식으로 정의됩니다.
protocol SomeProtocol {
// 프로토콜 정의가 여기에 위치
}
사용자 정의 타입은 해당 타입의 이름 뒤에 콜론을 붙이고 프로토콜 이름을 명시하여 특정 프로토콜을 채택합니다,
여러 프로토콜을 채택할 때는 콤마(,)로 구분합니다.
struct SomeStructure: FirstProtocol, AnotherProtocol {
// 구조체 정의가 여기에 위치
}
class SomeClass: SomeSuperclass, FirstProtocol, AnotherProtocol {
// 클래스 정의가 여기에 위치
}
참고로 프로토콜은 타입이기 때문에 대문자로 시작합니다.
Property(속성)요구사항
프로토콜의 프로퍼티 요구사항은 항상 var 키워드로 시작합니다.(weak등은 사용불가)
읽기와 쓰기가 모두 가능한 속성은 { get set }으로 읽기만 가능한 속성은 { get }으로 표시됩니다.
또한 타입프로퍼티도 사용가능
protocol SomeProtocol {
var mustBeSettable: Int { get set }
var doesNotNeedToBeSettable: Int { get }
var someNum: Int { set } //set만 쓰는건 불가능함 (에러)
static var someTypeProperty: Int { get set }
}
property적용 예시
protocol FullyNamed {
var fullName: String { get }
}
struct Person: FullyNamed {
var fullName: String
}
let john = Person(fullName: "John Appleseed")
// john.fullName은 "John Appleseed"
이 예시는 protocol에 인스턴스Property를 읽기 전용으로 지정했고 Struct Person에서 FullyNamed protocol을 채택해 적용한 예시입니다. 프로토콜의 요구된 사항이 채택하는 쪽에서 충족되지 않는다면 오류가 발생합니다.
더 복잡한 예시
protocol FullyNamed {
var fullName: String { get }
}
class Starship: FullyNamed {
var prefix: String?
var name: String
init(name: String, prefix: String? = nil) {
self.name = name
self.prefix = prefix
}
var fullName: String {
return (prefix != nil ? prefix! + " " : "") + name
}
}
var ncc1701 = Starship(name: "Enterprise", prefix: "USS")
// ncc1701.fullName은 "USS Enterprise"
이 클래스는 FullName 속성 요구사항을 스타쉽을 위한 계산 읽기 전용 속성으로 구현합니다. 각 Starship클래스 인스턴스는 필수 name과 선택적 perfix를 저장합니다. fullName의 property는 perfix값이 존재하는 경우 이를 사용하고 name의 앞에 추가하여 스타쉽의 전체 이름을 생성합니다.
메서드 구현
프로토콜은 준수하는 타입이 특정 인스턴스 메서드와 타입 메서드를 구현하도록 요구할 수 있습니다. 이러한 메서드는 프로토콜 정의의 일부로 작성되며, 일반 인스턴스와 타입 메서드와 동일한 방식으로 작성되지만 중괄호나 메서드 본문은 포함하지 않습니다. 가변 매개변수는 허용되며, 일반 메서드와 동일한 규칙이 적용됩니다. 그러나 프로토콜 정의 내에서 메서드 매개변수에 대한 기본값을 지정할 수는 없습니다.