본문 바로가기

# 02/Swift

[Swift] 프로토콜

반응형

프로토콜은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 이니셜라이저 등의 요구사항을 정의한다.


- 구조체, 클래스, 열거형은 프로토콜을 채택(Adopted)해서 프로토콜의 요구사항을 실제로 구현할 수 있다.


- 어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 '프로토콜을 준수한다(Conform)'고 표현한다.


- 프로토콜의 요구사항을 총족시키려면 프로토콜이 제시하는 기능을 모두 구현해야 한다.




protocol 프로토콜 이름 {

정의부

}








Protocol Talkable {


var topic: String { get set }

var language: String { get }


// 메서드 요구

func talk()


// 이니셜라이저 요구

init(topic: String, language; String)

}



// 프로토콜 채택 및 준수


// Person 구조체는 Talkable 프로토콜을 채택했다.


struct Person: Talkable {


var topic: String

let language: String


// 읽기전용 프로퍼티 요구는 연산 프로퍼티로 대체가 가능하다.

var language: String { return "한국어" }


// 물론 읽기, 쓰기 프로퍼티도 연산 프로퍼티로 대체할 수 있다.

var subject: String = ""

var topic: String {

set {

self.subject = newValue

}

get {

return self.subject

}

}





// 프로토콜은 클래스와 다르게 다중 상속이 가능하다.


protocol 프로토콜 이름: 부모 프롵토콜 이름 목록 {

정의부

}





// 클래스 상속과 프로토콜


// 클래스에서 상속과 프로토콜 채택을 동시에 하려면

// 상속받으려는 클래스를 먼저 명시하고

// 그 뒤에 채택할 프로토콜 목록을 작성한다.


class SuperClass: Readable {

func read() { print("read") }

}



class SubClass: SuperClass, Writeable, ReadSpeakable {

func write() { }

func speak() { }

}




// 프로토콜 준수 확인

// 인스턴스가 특정 프로토콜을 준수하는지 확인할 수 있다.

// is, as 연산자 사용



let sup: SuperClass = SuperClass()

let sub: SubClass = SubClass()


var someAny: Any = sup

someAny is Readable    // true

someAny is ReadSpeakable    // false


someAny = sub

someAny is Readable     // true

someAny is ReadSpeakable    // true



someAny = sup


if let someReadable: Readable = someAny as? Readable {

someReadable.read()

}    // read


if let someReadSpeakable: ReadSpeakable = someAny as? ReadSpeakable {

someReadSpeakable.speak()

}        // 동작하지 않음



someAny = sub


if let someReadable: Readable = someAny as? Readable {

someReadable.read()

}    // read




반응형

'# 02 > Swift' 카테고리의 다른 글

[Swift] 오류처리  (0) 2020.06.05
[Swift] 익스텐션  (0) 2020.06.05
[Swift] assert와 guard  (0) 2020.06.05
[Swift] 타입캐스팅  (0) 2020.06.04
[Swift] 옵셔널 체이닝과 nil 병합 연산자  (0) 2020.06.04