• Home
  • About
    • 밤에 쓴 코드 photo

      밤에 쓴 코드

      부엉이의 개발 노트

    • Learn More
    • Facebook
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Swift 2

11 Apr 2019

Reading time ~2 minutes

Procotol

위키백과

  • 통신 프로토콜은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 **규칙 의 체계이다.**

예시

swift 프로토콜은 규칙을 표현한다는 점에서 비슷하지만 조금 다른 의미로 사용된다.

내가 좋아하는 yagom 은 명찰,공고 를 통해 이야기를 해주었다.

프로토콜은 일종의 명찰이다 .

어떤 클래스(구조체)가 특정 프로토콜을 채택하게되면 프로토콜이 요구하는 사항들을 준수해야한다. 따라서 특정프로토콜을 구현한 클래스를 통해 생성된 오브젝트는 해당 프로토콜에서 요구되는 능력들을 수행할 수 있음을 신뢰할 수 있다.


struct Patient {
    let helper : Any
}

let 부엉이 = String()
let 환자 = Patient(helper: 부엉이)

한 환자가 있습니다. 환자는 자신을 치료해줄 사람이 필요합니다. 위와 같이 Any타입의 부엉이는 부적절합니다. 자신을 치료해줄 능력이 있는 객체를 원하고있으니까요.

protocol Healable{
    var 착한마음씨 : String { get }
    func heal()
}

이렇게 프로토콜로 하나의 책임을 만들었습니다.

치료를 하기위해선 착한마음씨를 가져야하고, 치료를 할수 있어야합니다.

struct Patient {
    let helper : Healable
}

Patient구조체를 그에 맞게 수정하겠습니다. helper는 Healable프로토콜을 준수하면 누구나 상관없습니다.


struct Nurse : Healable{
    var 착한마음씨: String
    func heal() {
        print("주사로 치료합니다")
    }
}

struct Doctor : Healable {
    var 착한마음씨: String
    func heal() {
        print("수술로 치료합니다.")
    }
}


struct Grandma: Healable {
    var 착한마음씨: String
    func heal(){
        print("약손으로 치료합니다")
    }
}

각각의 구조체들로 생성된 인스턴스들은 다른 방식으로 heal 동작을 수행하지만 heal이라는 동작은 모두 해야합니다.

그럼 환자는 위의 구조체로 생성된 어느 인스턴스라도 helper 로서의 자격이 있기에 치료받을수있겠네요.


소프트웨어에 객체들을 표현함에 있어서 , 사물이 있을 수 있고 , 사물이 할 수 있는 역할을 표현 할 경우도 있다. 특정 역할을 표현하고 , 그것에 만족하는 객체만 필요로 하는 경우가 있습니다. 또 유연하게 그 역할을 할수있으면 누구나 가능하게끔 유연하게 프로그래밍을 짜기위해서 프로토콜은 아주 적잘한 선택일거 같습니다.


문법 팁

  • & 로 여러 프로토콜을 요구하는 변수를 선언할수있다
    • let 의사 : Healable & Careable
  • 여러 프로토콜을 채택한 경우 프로토콜간의 변수의 타입이 다르면 충돌이 날 수 있습니다.
  • 가이드 라인을 준수하여 , 명사로 표현 / 기능을 나타내는 프로토콜 -able,-ible,-ing 접미사 추가
    protocol Healable {
      let 착한마음씨:String
      func heal()
    }
    protocol Careable{
      let 착한마음씨:Int
      func heal()->(Any)
    }
    struct 의사 :Healable,Careable{
      // 충돌
    }
    


Share Tweet +1