프로토콜 -> 다른 언어의 인터페이스와 비슷

프로토콜을 준수한다(comform)

프로토콜에서 정의한 메소드의 이름, 타입, 매개변수 등이 모두 같아야 한다.

프로토콜에서는 메소드만 정의하고, 실제 구현은 프로토콜을 준수하는 쪽에서 한다.

프로토콜은 타입이다. Int, String처럼 대문자로 시작한다.

프로토콜에서는 프로퍼티 또한 정의할 수 있다. 변수/상수는 getter와 setter가 있는 계산된 프로퍼티 (computed property)가 될 수 있다.

{get} or {get set}

프로퍼티도 마찬가지로 기본값을 설정할 수 없기 때문에, 프로토콜을 준수할 때 값을 입력해야 한다.

프로퍼티를 프로토콜에 정의할 때는 항상 var로 정의한다.

불투명(opaque)한 타입

함수 또는 메소드에서 반환하는 값의 자세한 타입을 숨긴다.
컴파일러는 값의 자세한 타입을 알 수 있지만 소프트웨어의 다른 모듈은 알 수가 없다.

Equatable

타입끼리 비교연산 ==을 사용 가능하게 해주는 프로토콜이다.

Int, String 등의 기본 자료형에는 이미 프로토콜이 구현되어 있으나, 구조체나 클래스에는 기본적으로 구현되어 있지 않다.

클래스나 구조체 인스턴스끼리 비교연산을 사용하기 위해서는 Equatable 프로토콜을 채택하면 된다.

불투명한 반환 타입

함수나 메소드에서 불투명한 타입을 반환 타입으로 지정할 수도 있다.

불투명한 타입 반환으로 반환하려는 인스턴스가 준수하고 있는 프로토콜을 반환 타입으로 선택할 수 있으며, 이 때 some 키워드를 반환 타입 앞에 명시하여 반환하려는 객체가 특정 프로토콜을 준수함을 알린다.

func getRandomNumber() -> some Equatable {
    Int.Random(1...6)
    //Double.Random(in:)으로 변경해도 잘 작동한다! 
    //반환타입이 Int가 아닌 Equatable 프로토콜이기 때문에.
}

swiftUI에서는 ui 레이아웃을 표현하고 반환할 때 사용된다.
레이아웃에 대한 상세 설명들을 인자로 넣는 대신에, 설명 자체를 반환 타입으로 지정한다.

=> some View의 의미. swift는 해당 view의 상세 타입을 알고 있다.

확장 (Extensions)

~ed, ~ing

값을 복사하여 가공한 후 반환하는 경우 ~ed, ~ing가 붙고,
값을 직접 수정하는 경우 원래 동사를 사용함.

프로토콜 확장 (Protocol Extensions)

프로토콜을 준수하는 구조체, 클래스에 확장을 사용할 수 있음.

계산된 프로퍼티와 메소드에 기본 구현을 제공하기 위해 프로토콜을 확장할 수 있다.

프로토콜을 채택한 부분에서 프로퍼티나 메소드를 자체적으로 구현하는 경우, 확장에 의해 구현된 것 대신 사용된다.


참고: https://www.hackingwithswift.com/100/swiftui/13

카테고리:

업데이트: