iOS/Swift 문법

[Swift문법] 프로토콜, 불투명 반환

초코비23 2022. 1. 3. 20:42

스위프트 프로토콜

클래스가 구조적으로 올바르게 되기 위하여 스위프트 클래스가 반드시 따라야 할 특정 규칙은 기본적으로 없다.

하지만, 다른 클래스와 함께 작업을 해야 할 때는 특정 조건에 맞춰야 한다.

iOS SDK의 다양한 프레임워크와 함께 동작하는 클래스를 만들 떄는 더욱 그러하다.

 

클래스가 충족해야 하는 최소한의 요구사항을 정의하는 규칙들의 집합을 프로토콜(protocol)이라고 한다.

프로토콜은 protocol 키워드를 이용하여 선언되며, 클래스가 반드시 포함해야 하는 메서드와 프로퍼티를 정의한다.

 

예를 들어, 어떤 클래스가 프로토콜을 채택했으나 모든 프로토콜의 요구사항을 충족하지 않는다면,

그 클래스가 해당 프로토콜을 따르지 않는다는 에러가 발생한다.

 

프로토콜 선언은

protocol MessageBuilder {

	var name : String { get }
    func buildMessage() -> String

}

이 프로토콜을 채택하는 클래스는 String 타입의 name이라는 프로퍼티와 매개변수를 받지 않고 문자열 값을 반환하는 buildMessage()메서드를 반드시 포함해야 한다.

 

class MyClass : MessageBuilder { // MessageBuilder 프로토콜 채택
	
    var name : String
    
    init(nane: String) {
    	self.name = name
    }
    
    func buildMessage() -> String{
    	"Hello " + name
    }
}

이 소스와 같이 name 프로퍼티, buildMessage() 메서드 를 꼭 반드시 포함해야지 오류가 안난다.

 

 

불투명 반환 타입

함수가 결과를 반환한다면 함수 선언부에 결과의 타입이 포함되어야 한다.

예를 들어, 다음의 함수는 정수형 결과를 반환하도록 구성되어 있다.

func doubleFunc1(value: Int) -> Int {
	return value * 2
}

특정 반환 타입(구체화된 타입)을 지정하는 대신, 불투명 반환 유형을 사용하면 지정된 프로토콜을 따르는 모든 타입이 반환될 수 있게 한다.

불투명 반환 타입은 프로토콜 이름 앞에 some 키워드를 붙여 선언된다.

func doubleFunc1(value : Int) -> some Equatable {
	value * 2
}

이 코드는 doubleFunc1()함수가 Equatable프로토콜을 따르는 모든 타입의 결과가 반환된다고 선언한다.

 

스위프트가 제공하는 표준 프로토콜인 Equatable 프로토콜을 따르기 위해서는 값들이 서로 동일한지 비교할 수 있어야 하지만

불투명 반환 타입은 직접 만든 프로토콜을 포함하여 모든 프로토콜에 사용될 수 있다.

 

Int와 String 타입 모두가 Equatable 프로토콜을 따른다면 문자열 결과를 반환하는 함수 또한 생성할 수 있다.

func doubleFunc2(value : String) -> some Equatable {
	value + value
}

두 개의 메서드 doubleFunc1()과 doubleFunc2()는 완전히 서로 다른 구체화된 타입을 반환하지만, 이들 타입에 대해 알고 있는 유일한 것은 Equatable 프로토콜을 따른다는 것이다.

즉 실제 반환 타입을 아는 게 아니라 반환 타입의 자격에 대해 아는 것이다.

 

 

이 불투명 반환 타입은 라이브러리나 API 프레임워크 내에 있어서 소스 코드를 볼 수 없다면, 정확히 어떤 타입이 반환되는지 모를 것이다.

공개 API내에서 사용되는 반환 타입을 숨기기 위해 의도적으로 이렇게 설계된다.

 

 

 

출처 : 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍

책을 보면서 내용을 정리했습니다.. 혹시 틀린 내용이 있다면 댓글로 언제나 말씀해주세요!!!☺️