반응형
Notice
Recent Posts
Recent Comments
Link
Today
Total
07-07 21:40
«   2024/07   »
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
Archives
관리 메뉴

iOS 개발 기록 블로그

iOS (Swift) Protocol 이란? 본문

iOS

iOS (Swift) Protocol 이란?

crazydeer 2022. 6. 15. 09:00
반응형

지난 글에서 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
}

 

 

 

 

iOS (Swift) UITextField 다루기

생성 스토리보드에서 + 버튼을 눌러 Text Field를 생성하면 된다. 해당 UI를 클릭하면 오른쪽에 속성 인스펙터 창에서 위와 같이 볼 수 있다. Placeholder는 희미하게 보이는 회색 글자

crazydeer.tistory.com

지난 글에서 마지막에 봤던 UITextFieldDelegate라는 프로토콜이다.

 

 

프로토콜에 대해서는 이정도로 알아보고

Swift Protocol 사용한 delegate라는 패턴에 대해서 다음 글에서 알아보자.

 

 

 

 

참고

안젤라유 강의: https://www.udemy.com/course/ios-13-app-development-bootcamp/

 

iOS & Swift - The Complete iOS App Development Bootcamp

From Beginner to iOS App Developer with Just One Course! Fully Updated with a Comprehensive Module Dedicated to SwiftUI!

www.udemy.com

 

반응형