Swift3(스위프트3)

swift3 스위프트3 protocol 프로토콜, 프로토콜 상속에 대해

알통몬_ 2017. 7. 12. 11:54
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


먼저 구글 사전의 정의입니다.


그렇다면 스위프트3에서 프로토콜은 어떻게 쓰일까요.

 : 특정한 역할을 수행하기 위한 메소드, 프로퍼티, 이니셜라이저(생성자)들의 

요구사항을 정의하는데 사용합니다.

클래스, 구조체, 열거형은 프로토콜을 채택해서 프로토콜의 요구 사항들을 실제로 

구현할 수 있습니다.

어떤 프로토콜의 요구 사항을 모두 따르는 타입을 보고 '어떤 프로토콜을 모두 준수한다'라고

말합니다. 프로토콜의 요구 사항을 충족시키기 위해서는 포로토콜이 지시하는 기능을

모두 구현해야 합니다.


프로토콜 정의

protocol ProtocolName {

   // 정의

}


예제)

protocol Runnable {

  // 프로퍼티 요구

 - let이 아닌 var 키워드만 사용

 - get 은 읽기만 해도 상관 없다는 뜻

 - get, set 을 모두 명시했을 경우 읽기와 쓰기가 모두 가능한 프로퍼티여야 함

 ex

 var shoes : String { get }

 var place : String { get }


  // 메소드 요구

 func run() // 자바의 인터페이스에서 추상 메소드를 선언할 때와 비슷하군요


 // 이니셜라이저(생성자) 요구

 init(shoes : String, place : String) 

}



프로토콜을 채택하고 준수한 구조체

struct Man : Runnable {

   var shoes : String

   var place : String

 /*

  읽기 전용 프로퍼티의 경우 연산 프로퍼티로 대체 가능합니다.

    var place : String { get { return "헬스장" } }

 */

   var shoesType : String = ""

   var shoes : String {

    set {

      self.shoesType = inputValue    

    }

    get {

       return self.shoesType

    }

 }

  func run() {

     print(\(shoesType) 를 신고 \(place)에서 달리기를 합니다)

  }


  init ( shoes : String, place : string) {

     self.shoes = shoes

     self.place = place

  }

}

위 Man 이라는 구조체는 Runnable 프로토콜을 채택하고 준수한 구조체입니다.



다음은 프로토콜 상속입니다.

프로토콜은 클래스와 다르게 다중 상속을 지원합니다.

protocol Child : Parent1, Parent2 {

   //정의

}

protocol Runnable {

   func run()

}

protocol Walkable {

   func walk()

}

protocol RunRestable : Runnable {

   //func run() 은 이미 부모의 것을 상속 받고 있으므로 따로 정의하지 않아도 됩니다.

  func rest()

}

protocol RunWalkRestable : Runnable, Walkable {

  // func run()

  // func walk()

  func rest()

}

이제 구조체가 RunWalkRestable 을 채택한다면 Runnable, Walkable 의 메소드 요구까지 구현해줘야 합니다.

struct Man : RunWalkRestable {

   func run() {

      print("런닝을 합니다")

   }

   func walk() {

      print("걷기를 합니다")

   }

   func rest() {

      print("휴식을 합니다")

   }

}


만약 클래스에서 상속과 프로토콜 채택을 동시에 하려고 한다면,

상속 받으려는 클래스를 첫 번째로 명시하고, 그 뒤에 프로토콜을 명시해 주면 됩니다.

순서는 바뀌면 안됩니다.


예제)

class Parent : Runnable {

   func run() {

      print("런닝을 합니다")

   }

}

class Child : Parent, Walkable, RunRestable {

   // 이미 부모 쪽에서 run() 메소드 요구를 준수했기 때문에

   func walk() {

      print("걷기를 합니다")

   }

   func rest() {

      print("휴식을 합니다")

   }

  // 위 두 메소드 요구만 준수해주면 됩니다.

}


프로토콜을 준수하는지 확인 :

인스턴스가 특정한 프로토콜을 준수하는지 확인하고 싶을 경우 is 와 as 연산자를 사용합니다.


let parent : Parent = Parent()

let child : child = Child()


var value : Any = parent

value is Runnable // true
value is Walkable // false

value = child

value is Runnable // true
value is Walkable // true

value = parent

if let val : Walkable = value as? Walkable {

   print ("참")

}

이상입니다~


다음 포스팅에서는 익스텐션에 대해 공부합니다.


감사합니다.


반응형