본문 바로가기
프로그래밍/Swift

Swift Protocol 정의

by Mr-후 2021. 7. 9.
반응형

나는 좀 더 공부를 해보기로 했다. 그 내용이 무엇이던지간에 좀 더 파보기로 했다.

스위프트에서 프로토콜을 정의하는 방법은 다음과 같다.

protocol MyProtocol {
    //프로토콜 정의는 여기에...
}

protocol 키워드를 사용하며, 그 다음으로 프로토콜 이름이 위치한다.

커스텀 타입은 타입 이름 뒤에 콜론으로 구분해 프로토콜의 이름을 위치시킴으로써 해당 타입이 따르는 특정 프로토콜을 나타낼 수 있다. -> 즉 계약의 역할, 구현할 것을 약속하는 것이다.

struct MyStruct: MyProtocol {
   //구조체 구현체는 여기에 위치한다.
}

타입은 다중 프로토콜을 따를 수 있다. 다중 프로토콜은 콜론으로 구분해 열거하면 된다.

struct MyStruct: MyProtocol, AnotherProtocol, ThirdProtocol {
   //구조체 구현체는 여기에..
}

프로토콜에서 프로퍼티를 정의할 때에는 get / set 키워드를 사용해 프로퍼티가 읽기 전용 프로퍼티인지 읽고 쓰기 프로퍼티인지를 반드시 명시해줘야 한다.

프로토콜에서는 타입추론을 사용할 수 없으므로 타입을 반드시 명시해야 한다.

protocol FullName {
   var firstName: String {get set}
   var lastName: String {get set}
}

이 FullName을 따르는 모든 타입은 이 두 프로퍼티를 반드시 구현해야 한다.

읽기 전용 프로퍼티의 경우는 다음과 같이 get 키워드만 정의한다.

var readOnly: String {get}

정적 프로퍼티는 static키워드를 사용하여 정의한다.

static var typeProperty: String {get}

프로토콜을 따르는 타입에 구체적인 메소드를 제공할 것을 요구할 수 있다. 이러한 메소드는 프로토콜에 정의되며 중괄호와 메소드 몸체가 없다는 점을 제외하고는 클래스와 구조체에서 정의했던 것과 똑같다.

static키워드를 사용함으로써 이러한 메소드가 인스턴스 메소드나 타입 메소드가 되도록 정의할수 있다.

프로토콜에 메소드를 정의할 때에는 메소드 매개변수에 기본 값을 추가하는 것은 허용되지 않는다.

FullName 프로토콜에 getFullName()이라는 메소드를 추가하면 다음과 같다.

func getFullName() -> String

* 구조체와 같은 값 타입의 경우 메소드가 메소드 자신이 속해 있는 인스턴스의 변경이 필요할 때는 메소드 정의부 앞부분에 mutating키워드를 추가하면 된다.
즉, 자신이 속한 인스턴스와 인스턴스 내의 어떠한 프로퍼티도 변경할 수 있음을 뜻한다.

mutating func changeName()

참조타입(클래스)에서는 굳이 필요없고, (참조타입이니, 변경이 가능함) mutating키워드는 오직 값(구조체, 열거형) 타입에만 사용된다.

프로토콜을 따르는 타입의 입장에서 선택 가능한 요구사항을 정의할 수 있다. 반드시 구현하지 않아도 되는 요구사항은 메소드나 프로퍼티의 구현을 요구하지 않는다. 선택 가능한 요구사항을 사용하기 위해서는 프로토콜을 표시할 때  @objc 속성이 프로토콜 앞부분에 위치해야 한다.

*오직 클래스만이 @objc 속성을 사용하는 프로토콜을 채용할 수 있다는 것을 아는 것이 중요. (구조체와 열거형은 채용할 수 없다)

optional 키워드를 사용하면 프로퍼티나 메소드가 선택 가능하다는 것으로 표시할 수 있다.


반응형