본문 바로가기

IT/Swift

[swift] Protocol

[swift 기초문법] - 프로토콜(Protocol)

프로토콜이란(Protocol)

프로토콜은 특정 작업 혹은 기능들을 구현하기 위한 메소드, 프로퍼티 그리고 기타 다른 요구사항들의 청사진입니다.

프로토콜을 클래스, 구조체 또는 열거형에서 채택(adopted)하여 이러한 프로토콜의 요구사항을 실제로 구현할 수 있습니다.

프로토콜의 요구사항을 모두 충족시키는 타입은 해당 프로토콜을 준수(conform)한다고 합니다.

프로토콜은 정의를 할 뿐이지 구현을 하지는 않습니다.

추가적으로, 프로토콜은 구현해야할 요구사항을 지정하는 것 이외에도, 프로토콜을 확장하여 이러한 요구사항 중 일부를 구현하거나, conforming타입에서 활용할 수 있는 추가 기능을 구현할 수 있습니다. 

앞에 protocol 키워드를 붙여 선언합니다.

  protocol SomeProtocol {

    //프로토콜 내용 구현

  }

 

다른 클래스, 구조체에서 채택 : (클론) 뒤에 채택할 프로토콜 이름을 넣어주면됩니다.

  class Some: SomeProtocol {

  }

 

일반적으로 선언된 메소들은 하나라도 구현하지 않으면 에러 발생합니다.

선택적인 메소드 구현을 위해서는 @obc 키워드나 optional 을 이용하면 됩니다.

 

 

 

 

프로퍼티 선언

읽기만 가능한지, 읽기 / 쓰기 모두가 가능한지 명시해야 합니다.

프로퍼티는 항상 var로 선언해야 합니다.

프로토콜은 프로퍼티가 저장 프로퍼티인지, 연산 프로퍼티인지 명시하지 않습니다.

타입 프로퍼티를 요구할 때는 static  키워드를 사용합니다.

protocol SomeProtocol {

    var mustBeSettable: Int { get set }

    var doesNotNeedToBeSettable: Int { get }

    static var someTypeProperty: Int { get set }

}

 

메서드 선언

메서드의 구현부 중괄호({}) 부분은 제외하고 메서든의 이름, 매개변수, 반환 타입등만 작성합니다.

타입 메서드를 요구할 때는 앞에 static키워드를 명시합니다. 타입 메서드를 실제 구현할  때에는 static 키워드나  class 키워드를 사용해도 됩니다.

가변 메서드를 요구하려면 메서드 정의 앞에 mutating 키워드를 명시합니다.(클래스는 상관없으나 구조체와 열거형에서는 사용)

mutating을 사용해 정의했어도 구현시에는 mutating 키워드가 생략 가능합니다.

이니셜라이저 선언

매개변수를 지정하기만 합니다. 중괄호를 포함 내용은 구현하지 않습니다.

protocol TestProtocol {

  var title: String { get }

  init(name: String)

}

 

 

프로토콜의 상속

protocol ChildProtocolName: ParentsProtocol {

}

 

클래스 전용 프로토콜

class 키워드를 추가해 프로토콜이 클래스 타입에만 채택될 수 있도록 제한할 수 있습니다.

프로토콜의 상속 리스트의 맨 처음에 class 키워드를 정의합니다.

protocol ClassTestProtocol: class, ParentsProtocol {}

class testClass: ClassTestProtocol {}

struct testStruct: ClassTestProtocol {} -> error!

 

 

 

 

#swift 기초

#swift 강의

#ios programming

'IT > Swift' 카테고리의 다른 글

[swift] swift5  (0) 2019.08.21
[swift] guard  (0) 2019.08.21
[swift] try? try! try  (0) 2019.08.21
[swift] 스위프트의 특징  (0) 2019.08.21
[swift] ARC(Automatic Reference Counting)  (0) 2019.08.21