일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- velog
- 코드트리
- Apple Developer Academy
- iOSDeveloper
- SWIFT
- Front-end
- globalcommunity
- 프로그래머스
- 회고
- 코딩테스트
- tshaped
- react
- AppleDeveloperAcademy
- Xcode
- frontend
- 프론트엔드
- 알고리즘
- ios
- 자바스크립트
- UIKit
- 코딩테스트실력진단
- error
- 코드트리챌린지
- git
- swiftUI
- 프로젝트
- NextJs
- TypeScript
- JavaScript
- react-query
Archives
- Today
- Total
Moon Work
[Swift] Swift 기본 문법 정리 4: Protocol 📑 본문
시작하며
Swift를 배우면서 가장 흥미로웠던 부분은 이 protocol이었다. typescript에서 제공하는 type과 interface을 통한 다형성과 유연성을 제공해주어 기존 js가 가진 불안한을 해소시켜 주었었다. 이번 protocol 정리와 다음에 정리한 extension을 통해 이후에 나올 Swift의 POP를 가능하게 하는지 이해할 수 있었으면 좋겠다.
Protocol
- 프로토콜은 지켜야할 규칙, 즉 인터페이스로 struct, class, enum 등이 가져야 할 메소드나 프로퍼티의 청사진을 정의한다.
- 특정 기능을 실행하기 위해 프로토콜을 채택하고 그 요구사람을 구현하면 "해당 프로토콜을 준수한다"라고 말할 수 있다.
Protocol 구조와 Protocol 채택
//프로토콜 정의
protocol 프로토콜이름 {
프로퍼티 요구
메서드 요구
이니셜라이저 요구
}
//프로토콜 채택
struct 구조체이름: 프로토콜이름 {
//해당 프로토콜의 요구사항을 구현해야 한다.
}
//여러개의 프로토콜을 채택할 경우
struct 구조체이름: 프로토콜1, 프로토콜2, 프로토콜3 ... {
...
}
프로퍼티 요구
- 프로토콜을 따르는 대상이 특정 프로퍼티를 구현하도록 요구할 수 있다.
- 요구를 할 때는 var 키워드를 사용한다.
- 구현시 연산 프로퍼티(computed property)로 구현할 수도 있다.
- 옵셔널로 사용하고 싶은 경우 @objc 키워드를 붙여서 만들 수 있다.
protocol Person {
// 읽기 전용 프로퍼티를 요구할 경우
var name: String { get }
// 읽기와 쓰기 모두 가능하게 요구할 경우
var age: Int { get set }
}
@objc protocol Human {
var age: Int { get set }
@objc optional var nickname: String { get set }
}
struct Student: Person {
//읽기 전용으로 프로퍼티 요구를 했기 때문에 let, var 모두 사용가능
let name: String
//get, set 모두 가능하게 요구하기 때문에 반드시 var를 사용
var age: Int
}
메서드 요구
- 프로토콜에서 특정 메서드나 타입 메서드를 요구할 수 있다.
- 메서드를 정의할 때는 함수명과 반환값을 설정할 수 있다.
- struct와 같이 값 타입에서 내부의 값을 변경할 경우 mutating 키워드를 사용해서 명시해주어야 한다. 해당 mutating 키워드를 가진 프로토콜을 class에서 구현할 경우 mutating 키워드는 뺴고(class는 reference type이기 때문에) 구현하면 된다.
protocol Person {
func walk()
}
struct Student: Person {
func walk(){
print("walking🚶♂️")
}
}
protocol Human {
var age: Int { get }
mutating func setAge(_ newAge: Int)
}
struct Moon: Human {
var age: Int = 0
mutating func setAge(_ newAge: Int) {
age = newAge
}
}
var moon = Moon()
moon.setAge(26)
moon.age
프로토콜 상속
protocol Person {
var name: String
}
protocol Student: Person {
var major: String
func study()
}
프로토콜을 준수하는지 확인하기
- is, as 연산자를 사용해서 해당 인스턴스가 특정 프로토콜을 준수하는지 확인할 수 있다.
protocol PersonP {
var name: String { get }
}
protocol StudentP: PersonP {
var major: String { get }
func study()
}
struct Student: StudentP {
var name: String = ""
var major: String = ""
func study(){
print("study hard")
}
}
var austin: Student = Student()
austin is PersonP // true
참고자료
https://babbab2.tistory.com/175
Swift) Protocol 이해하기 (2/6) - 프로퍼티 / 메서드 선언 이해하기
안녕하세요!? 소들입니다 ☘️ 저번 포스팅에서 프로토콜이 무엇인지에 대해 간단하게 공부했잖아요!?!?! 이번엔 이 프로토콜을 프로퍼티, 메서드로 선언할 때의 여러 가지 특징(?)에 대해 공부
babbab2.tistory.com
오늘의 Swift 상식 (Protocol)
프로토콜이란?
medium.com
'Swift' 카테고리의 다른 글
[Swift] 메모리 참조 strong, weak, unowned 비교 (0) | 2023.02.09 |
---|---|
[Swift] Swift 기본 문법 정리 5: Property (0) | 2023.02.01 |
[Swift] Swift 기본 문법 정리 5-1: 왜 Swift에는 Sturct와 Class로 나뉘어 있을까. (0) | 2022.12.26 |
[Swift] Swift 기본 문법 정리 3: 클로저 (2) | 2022.12.21 |
[Swift] Swift 기본 문법 정리 2: 함수 (0) | 2022.12.16 |