공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
먼저 구글 사전의 정의입니다.
그렇다면 스위프트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()
이상입니다~
다음 포스팅에서는 익스텐션에 대해 공부합니다.
감사합니다.
'Swift3(스위프트3)' 카테고리의 다른 글
swift3 스위프트3 오류처리 throws (0) | 2017.07.14 |
---|---|
swift3 스위프트3 익스텐션(extension) (0) | 2017.07.12 |
swift3 스위프트3 assert, guard (0) | 2017.07.11 |
swift3 스위프트3 타입 캐스팅 : 업 캐스팅과 다운 캐스팅 (0) | 2017.07.10 |
swift3 스위프트3 옵셔널 체이닝 / nil 병합 연산자란? (0) | 2017.07.10 |