• 프로토콜(Protocol)
    • 특정 클래스와 관련없는 프로퍼티, 메서드 선언 집합
      • 함수(메서드) 정의는 없음
      • 기능이나 속성에 대한 설계도
      • 클래스(구조체, 열거형)에서 채택(adopt)하여 메서드를 구현해야 함
    • 프로토콜 채택
      • class 클래스명:부모명, 프로토콜명1,프로토콜명2 {}
      • class 클래스명:프로토콜명{}
      • 부모가 없으면 바로 표기 가능
    • Protocol 정의
      protocol 프로토콜명{
      프로퍼티명
      메서드 선언 //메서드는 선언만 있음
      }
      protocol 프로토콜명 : 다른프로토콜, 다른프로토콜2{
      // 프로토콜은 다중 상속도 가능
      }
    
    • 프로토콜과 프로퍼티/메서드 선언
      protocol HoProtocol {
      var h: Int { get set } //읽기와 쓰기가 가능
      var s: Int { get }     //읽기 전용
      static var sh: Int { get set }
      static func typeMethod()
      func random() -> Double
      }
    
    • 채택과 준수
      protocol Ho { 
      var h : Int {get set} 
      func run() 
      }
      class Shin : Ho { //채택, adopt
      var h : Int = 1 //준수, conform 
      func run(){print("달린다~")} //준수, conform 
      }
    
  • Enum
    • 관련있는 데이터들이 멤버로 구성되어 있는 자료형 객체
      • 원치 않는 값이 잘못 입력되는 것 방지
      • 입력 받을 값이 한정되어 있을 때
      • 특정 값 중 하나만 선택하게 할 때
    • 정의

        enum Planet {
        case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
        } //하나의 case문에 멤버들 나열하는 것도 가
      
        enum Compass {
        case North
        case South
        case East
        case West
        }
         print(Compass.North)            //North
         var direction = Compass.West
         direction = .East
         print(direction, type(of:direction))   //East Compass
        //문맥에서 타입의 추론이 가능한 시점 (등호 좌변의 변수 타입이 확정적일 때)에는 열거형명 생략 가능
      
        enum Compass {
        case North
        case South
        case East
        case West
        }
        var direction : Compass
        direction = .South       //남
        switch direction {
        case .North:
        print("북")
        case .South:
        print("남")    
        case .East:
        print("동")
        case .West:
        print("서")
        }
      
      • 예제
        • 스와이프(swipe) 제스처는 UISwipeGestureRecognizer 클래스로 인식
        • 특정 방향으로의 스와이프는 다음 상수를 클래스의 direction 프로퍼티에 할당하여 인식
          • UISwipeGestureRecognizerDirection.right
          • UISwipeGestureRecognizerDirection.left
          • UISwipeGestureRecognizerDirection.up
          • UISwipeGestureRecognizerDirection.down
        • .right, .left, .up, .down으로 축약해서 쓸 수 있음
        • 설정된 방향이 없다면 기본 설정은 오른쪽 스와이프를 인식
        • UISwipeGestureRecognizer 인스턴스를 위쪽 스와이프에 대해 인식하도록 설정
          let swipeRecognizer = UISwipeGestureRecognizer(target: self, action: "swipeDetected")
          swipeRecognizer.direction = .up
          self.view.addGestureRecognizer(swipeRecognizer)