- 프로토콜(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)
- 예제
- 관련있는 데이터들이 멤버로 구성되어 있는 자료형 객체