protocol이란 ?
프로토콜이란 반드시 구현해야하는 요구사항을 미리 정의하는 타입이다.
class, struct, enum, 심지어 protocol도 또다른 protocol을 채택할 수 있다.
참고
애플 공식문서
property 정의하기
먼저 property를 정의할 때 protocol에서 어떤식으로 요구사항을 정의하는 지 알아보자
1) var로 시작해서 변수명과 타입을 지정한다.
2) 연산 프로퍼티를 이용하여 `get`과 `set`의 역할을 부여한다.
3) get set일 경우 let property와 getter only computed property는 사용할 수 없다.
protocol SomeProtocol {
var prop1: Int { get } // 읽기 전용
var prop2: Int { get }
var prop3: Int { get set }
var prop4: Int { get set }
}
class SomeClass: SomeProtocol {
var prop1: Int {
return 1 // getter only
}
let prop2: Int = 1 // ✅ let은 set을 할 수 없으므로 getter only
var prop3: Int = 3
let prop4: Int = 4 // ❌ let은 set을 할 수 없으므로 불가
}
method 정의하기
property보다 훨씬 간단하다.
1) 메소드 명 , 매개변수, 리턴 타입을 지정해준다.
2) class를 제외한 struct와 enum에서 인스턴스 프로퍼티를 수정할 때는 mutating 키워드를 이용합니다.
protocol SomeProtocol {
func f1(a: Int) -> Int
}
class SomeClass: someProtocol {
func f1(a: Int) -> Int { return 1}
}
// ======================================================================================
protocol SomeProtocol {
mutating func f2(n: Int)
}
struct SomeStruct : SomeProtocol {
var prop1: Int = 0
mutating func f2(n: Int) {
prop1 = n
}
}
protocol 확장
프로토콜을 확장하여 굳이 채택할 때마다 구현이 필요 없는 메서드를 기본적으로 구현하여 불필요한 구현을 방지한다.
protocol SomeProtocol {
func defaultFunc() -> Int
}
extension SomeProtocol { // 확장 하여 기본 동작 구현
func defaultFunc() -> Int {
return 1
}
}
struct SomeStruct: SomeProtocol {
// 구현하지 않아도 에러 발생하지 않음 ✅
}
struct SomeStruct2: SomeProtocol {
func defaultFunc() -> Int {
return 2
}
}
let ss = SomeStruct()
let ss2 = SomeStruct2()
print(ss.defaultFunc(), ss2.defaultFunc()) // 1 , 2
'프로그래밍언어 > swift' 카테고리의 다른 글
protocol 학습하기 (4) [ any, some ] (0) | 2024.08.25 |
---|---|
protocol 학습하기 (3) [ associatedtype ] (0) | 2024.08.25 |
protocol 학습하기 (2) [ generic, 합성, 채택 체크 ] (0) | 2024.08.25 |
생성자 (0) | 2024.08.24 |
class와 struct (0) | 2024.08.24 |