some 과 any

준우·2024년 2월 5일
0

Swift 이야기

목록 보기
11/19
post-thumbnail

불투명 타입이란?

함수나 메서드의 반환 타입으로 사용될 때, 구체적인 타입은 숨기면서 프로토콜을 준수하는 타입임을 보장해줍니다. 제네릭과 비슷하지만, 반환 타입에 대해 구체적인 타입 정보를 외부에 노출하지 않으면서도 타입 안전성을 유지할 수 있게 해줍니다.

some 은 뭐하는 키워드인가요?

Opaque Types(= 불투명 타입)을 선언할 때 사용합니다.

  • 목적 : 함수나 메서드가 구체적인 타입을 숨기면서 특정 프로토콜을 준수하는 타입을 반환하는 것을 보장하기 위해 사용합니다.

  • 타입 제약 : some 이라고 선언된 프로토콜은 하나의 구체적인 타입만을 반환합니다.

  • 사용하는 상황 : 구현 세부 사항을 숨기고 싶지만, 타입 정보까지 숨기고 싶지 않을 때 유용함

  • 예제 코드

import UIKit

protocol Car {
    associatedtype Identifier
    var id: Identifier { get }
}

struct BMW: Car {
    let id: String
    
    init(id: String) {
        self.id = id
    }
}

struct Honda: Car {
    let id: String
    
    init(id: String) {
        self.id = id
    }
}

func getFavoriteCar() -> some Car {
    return Honda(id: "honda") // Car 프로토콜을 준수하는 타입을 반환하지만, 그 구체적인 타입은 호출자에게 노출되지 않습니다.
}

print(String(describing: getFavoriteCar())) 

any 는 뭐하는 키워드인가요?

프로토콜 타입 앞에 사용되어, 해당 프로토콜을 준수하는 어떤 타입이든 될 수 있음을 나타냅니다.

  • 목적 : 특정 프로토콜을 준수하는 어떤 타입이든 될 수 있음을 나타냄
  • 타입 제약 : any 를 사용하는 변수나 함수는 해당 프로토콜을 준수하는 여러 다른 객체들을 할당 받을 수 있음
  • 사용하는 상황 : 하나의 프로토콜을 사용하여 다양한 타입을 처리하고 싶을 때 사용

프로토콜 타입을 사용할 때, 명시적으로 타입 소거의 의도를 표현하도록 하여 코드의 가독성을 높이고, 타입 체크의 명확성을 개선합니다.

  • 예제 코드
import UIKit

protocol Car {
    associatedtype Identifier
    var id: Identifier { get }
}

struct BMW: Car {
    let id: String
    
    init(id: String) {
        self.id = id
    }
}

struct Honda: Car {
    let id: String
    
    init(id: String) {
        self.id = id
    }
}

// any 는 Car 프로토콜을 준수하는 어떤 타입이든 처리할 수 있게 해줍니다. any 키워드를 사용했기 때문에 Car 프로토콜을 채택한 구조체를 유연하게 처리할 수 있습니다.
func getGoodCar(car: any Car) {
    print(car.id)
}

getGoodCar(car: BMW(id: "bmw"))

0개의 댓글