Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- ios
- Git
- 패스트캠퍼스후기
- 프로퍼티 관찰자
- userDefaults
- RawValue
- 옵셔널 체이닝
- 함수
- TableView
- SeSAC
- xcode
- Threading
- 30개프로젝트로배우는iOS앱개발withSwift초격자패키지Online
- 열거형
- switch
- cancelAsyncWrite
- 직장인인강
- 패스트캠퍼스
- swift
- 인스펙터
- 기본문법
- beginAsyncWrite
- 직장인자기계발
- Realm
- 문자열 보간법
- 패캠챌린지
- Optional Chaining
- enum
- Background
- 독학
Archives
- Today
- Total
아삭아삭 iOS 개발
[Swift 독학] 패스트캠퍼스 챌린지 29일차_프로토콜 본문
■ 프로토콜(protocol)
- - 특정 역할을 하기 위한 메서드, 프로퍼티, 이니셜라이저 등 기타 요구사항 등의 청사진을 정의
- 구조체, 클래스, 열거형은 프로토콜을 채택함으로써 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현 가능
-> 이 때 프로토콜이 요구하는 사항(기능)을 모두 충족할 경우, 해당타입이 채택한 그 프로토콜을 모두 ‘준수한다(conform)’고 말할 수 있음
- 프로포콜은 기능을 정의하고 제시만 할 뿐, 자체적인 기능 구현은 불가
(실제적인 구현은 그 프로토콜을 준수하는 타입이 하게됨)
protocol 프로토콜 이름 {
// 정의부분 //
}
■ 프로토콜 특징
- - 여러개의 프로토콜을 동시에 채택도 가능
(참고) 클래스에서 상속과 프로토콜 채택을 모두 할 경우 ‘:’ 뒤에 상속받는 클래스를 제일 앞에 먼저 명시하고, 그 뒤부터 채택하는 프로토콜 목록을 작성 - - 프로토콜을 채택한 타입에서 프로토콜이 요구하는 것 중 하나라도 구현하지 않으면 오류 발생
■ 프로토콜 내 요구사항
1) 프로퍼티 요구사항
- 프로토콜은 자신을 채택한 타입이 어떤 프로퍼티를 구현해야 하는지 요구할 수 있음
→ 특정 이름, 타입을 갖는 인스턴스 프로퍼티 또는 타입 프로퍼티를 제공하기 위해 요구사항 지정
→ 읽기만 가능한 프로퍼티인지{ get }, 읽기/쓰기 둘다 가능한 프로퍼티인지{ get set } 타입 선언 뒤에 get, set을 이용해 지정해 주어야 함
※ 단, 저장 프로퍼티인지, 연산 프로퍼티인지는 관여 못함 - 프로토콜에서 ‘읽기-쓰기’ 둘다 가능한 프로퍼티를 요구하는 경우, 저장된 프로퍼티 상수 또는 읽기전용 계산된 프로퍼티는 요구사항 충족 불가
- 프로토콜에서 ‘읽기’만 가능한 프로퍼티를 요구하는 경우, 모든 종류의 프로퍼티를 설정할 수 있음
- 프로퍼티 요구사항은 항상 변수(var)로 요구해야 함
- '타입 프로퍼티'를 요구하려면 항상 static 키워드를 var앞에 접두사로 써줘야 함
protocol BestExercise {
var exerciseName: String { get }
}
struct MarineSports: BestExercise {
var exerciseName: String
}
let paddleboard = MarineSports(exerciseName: "Standup paddle boarding")
paddleboard.exerciseName // Standup paddle boarding
2) 메서드 요구사항
- 프로토콜은 자신을 채택한 타입에 의해 구현되기 위해 메서드를 요구할 수 있음
※ 인스턴스 메서드, 타입 메서드 모두 가능 - 프로토콜에서 메서드를 정의할 땐 중괄호나 메서드의 본문은 필요가 없지만,
메서드에 필요한 매개변수는 정의해 주어야 함
※ 중괄호가 없거나 메서드 바디 없음
※ 가변 파라미터는 허용됨, 하지만 매개변수의 디폴트값은 지정 불가 - '타입 메서드'를 요구하려면 항상 static 키워드를 타입 메서드 요구사항 앞에 접두사로 써줘야 함
protocol QuarantineRules {
var selfQuarantine: String { get set }
func printQuarantineRules ()
}
struct Contact: QuarantineRules {
var selfQuarantine: String
func printQuarantineRules() {
print("밀접 접촉자로 판명된 \(selfQuarantine) 씨는 자가격리에 들어가야 합니다.")
}
}
let contact = Contact(selfQuarantine: "홍길동")
contact.printQuarantineRules() // 밀접 접촉자로 판명된 홍길동 씨는 자가격리에 들어가야 합니다.
3) 이니셜라이저 요구사항
- 프로토콜은 자신을 채택한 타입에 초기화 구문을 요구할 수 있음 (init)
※ 생성자 키워드와 매개변수만 작성해주면 됨
※ 중괄호 또는 초기화 구문 바디는 작성하지 않아도 됨 - 프로토콜의 생성자가 init() 일 경우,
→ 클래스에서 프로토콜이 요구하는 생성자를 채택하려면 required 수식어를 초기화 구문 구현에 표시해야 함
※ 만약 클래스 자체가 상속받을 수 없는 final class라면 required 식별자를 붙여줄 필요가 없음
→ 구조체에서 프로토콜이 요구하는 생성자를 채택하려면 required 식별자가 따로 필요 없음 - 하위 클래스가 상위 클래스의 지정된 초기화 구문을 재정의하고, 프로토콜로부터 일치하는 초기화 구문 요구사항이 구현될 경우,
→ required와 override 수식어 모두 초기화 구문에 표시
protocol SomeProtocol {
init()
}
class SomeClass: SomeProtocol {
required init() {
// 초기화 구문 //
}
}
본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.
■ fast campus강의 외 참조자료
[1] https://blog.yagom.net/562/
[2] https://bbiguduk.gitbook.io/swift/language-guide-1/protocols
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Swift' 카테고리의 다른 글
[Swift 독학] 패스트캠퍼스 챌린지 31일차_열거형(1) (0) | 2022.02.23 |
---|---|
[Swift 독학] 패스트캠퍼스 챌린지 30일차_익스텐션 (0) | 2022.02.22 |
[Swift 독학] 패스트캠퍼스 챌린지 28일차_assert와 precondition과 guard (0) | 2022.02.20 |
[Swift 독학] 패스트캠퍼스 챌린지 27일차_타입캐스팅 (0) | 2022.02.19 |
[Swift 독학] 패스트캠퍼스 챌린지 26일차_오버라이딩 (0) | 2022.02.18 |