- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- SWIFT
- Optional
- 티스토리챌린지
- sigmoid
- 명령어
- tapply
- 오블완
- HTTP
- cocoapods
- struct
- Observable
- swiftUI
- decode
- ios
- r
- Python
- 시각화
- SQL
- ReLU
- rest api
- Linux
- scheduledTimer
- substr
- rxswift
- 딥러닝
- Request
- barplot
- 연산자
- MVC
- deeplearning
iOS 개발 기록 블로그
iOS (Swift) Protocol 이란? 본문
지난 글에서 UITextFieldDelegate 라는 프로토콜이 있었다.
코드
class Bird { var isFemale= true func layEgg() { if isFemale{ print("Lay egg.") } } func fly() { print("Fly.") } } class Eagle: Bird{ func soar() { print("Soar.") } } class Penguin: Bird { func swim() { print("Swim.") } } let myEagle = Eagle() myEagle.fly() myEagle.layEgg() let myPenguin = Penguin() myPenguin.layEgg() myPenguin.swim() myPenguin.fly() |
위 코드를 보면 Bird 클래스를 수퍼클래스로
상속받은클래스와 Penguin 클래스가 있다.
그런데 지금 위 코드 상태에서는 Penguin 역시 fly 메서드를 사용할 수 있다.
이때 우리가 펭귄은 날지 못하기 때문에
fly 메서드를 사용하지 못하도록 제한해야 한다.
CanFly라는을 추가해준다.
프로토콜 안에는 func 함수명() 만 적어줘야 하고
중괄호로 body를 만들어서 fly 메서드를 정의할 수 없다.
그리고 Bird 클래스에서 만들어놓은 fly 메서드를 지우고
Eagle 클래스에 CanFly 프로토콜을 넣어보자.
그러면 위와 같이 에러가 나고
그걸 xcode가 제안하는 해결방법으로 Fix해보면 fly 라는
메서드를 정의하도록 자동으로 코드를 생성해준다.
정리
그러니까 정리하자면
프로토콜에 해당 메서드를 요구조건으로 정의하는 것이고
상속 시에 프로토콜을 같이 입력해주면
그 클래스에는 프로토콜에서 요구한 메서드가
꼭 포함되어야 하는 것이다.
protocol CanFly { func fly() } class Bird { var isFemale= true func layEgg() { if isFemale{ print("Lay egg.") } } } class Eagle: Bird, CanFly { func fly() { print("Eagle fly.") } func soar() { print("Soar.") } } class Penguin: Bird { func swim() { print("Swim.") } } struct FlyingMuseum { func flyingDemo(flyingObject: CanFly) { flyingObject.fly() } } struct Airplane: CanFly { func fly() { print("Airplane fly.") } } |
위와 같이 코드를 작성하고 아래와 같이 해보면
myPenguin은 Bird 클래스의 메서드는 모두 상속받아 사용이 가능하고
fly라는 함수가 없기 때문에 사용할 수 없게 잘 수정되었다.
flyingObject를 myPlane 뿐만 아니라 myEagle로 받을 수도 있다.
클래스 정의할 때 프로토콜로 CanFly를 넣었기 때문에
그러나 아래와 같이 CanFly 프로토콜이 추가되지 않은 myPenguin을
넣어줄 수는 없다.
결론
이로써 Eagle과 Penguin은 Bird에게 상속받아서
알을 낳는 기능과 암수를 구분하는 불리언 값을 받았다.
그리고 Airplane은 Bird의 메서드나 프로퍼티를 받을 이유가 없기 때문에
별도의 클래스이며 각각 펭귄, 독수리, 비행기 클래스에서
날 수 있는 클래스만 CanFly 프로토콜을 넣어 fly 함수를
만들게 하여 기능을 추가하게 했다.
이게 바로 프로토콜 이다.
물론 클래스나 구조체를 생성해줄 때 프로토콜을 여러개 넣을 수도 있다.
struct MyStruct: FirstProtocol, AnotherProtocol { // struct definition } class MyClass: SuperClass, FirstProtocol, AnotherProtocol { // class definition } |
지난 글에서 마지막에 봤던 UITextFieldDelegate라는 프로토콜이다.
프로토콜에 대해서는 이정도로 알아보고
Swift Protocol을 사용한 delegate라는 패턴에 대해서 다음 글에서 알아보자.
참고
안젤라유 강의: https://www.udemy.com/course/ios-13-app-development-bootcamp/
'iOS' 카테고리의 다른 글
iOS (Swift) OpenWeather API 사용하는 법 (0) | 2022.06.20 |
---|---|
iOS (Swift) Delegate Design Pattern & Protocol (0) | 2022.06.16 |
iOS (Swift) UITextField 다루기 (0) | 2022.06.14 |
iOS(Swift) 배경 이미지 다크모드에 따라 바뀌게 하기 (0) | 2022.06.10 |
iOS(Swift) Dark Mode 적용 및 Custom Set (0) | 2022.06.09 |