Swift에서 Some 키워드는 자동으로 빠르게 리턴 타입을 유추할 수 있는 기능입니다.
예제를 보면 금방 이해할 수 있습니다.
protocol Shape{
func describe() -> String
}
struct Square: Shape{
func describe() -> String {
return "I'm Square"
}
}
struct Circle: Shape{
func describe() -> String {
return "I'm Circle"
}
}
shape 프로토콜 내부에 describe() 함수를 선언합니다.
Square 및 Circle 구조를 만들고 Shape 프로토콜을 상속합니다.
그런 다음 describe() 함수를 모든 구조에서 재정의할 수 있습니다.
func makeShape() -> some Shape{
return Square()
}
print(makeShape().describe()) // I'm Square
makeShape 함수를 만들고 모양 로그 유형을 반환합니다.
Square()를 반환하면 정상적으로 실행됩니다.
이 예제에서는 some 키워드를 사용하지 않아도 정상적으로 작동합니다.
위의 함수에서와 같이 반환값이 도형이 아닌 사각형이면 반환값을 정확히 알 수 있습니다.
Shape가 반환되면 Square 또는 Circle이 함수 내에서 반환될 수 있습니다.
다른 예를 보자
//1
func someList() -> some Collection{
return (1,2,3)
}
//2
func someList() -> some Collection{
return (1 : "a", 2 : "b", 3 : "c")
}
간단한 예로 someList() 함수가 컬렉션을 반환한다고 선언하고 배열(1,2,3)을 반환하면 some 키워드가 없습니다.
(타입으로 ‘Collection’ 프로토콜을 사용하는 경우 ‘any Collection’으로 작성해야 함) 오류가 발생합니다. 따라서 some 키워드를 사용하여 반환 값을 난독 처리하고 반환 유형을 컴파일러에 숨길 수 있습니다.
불확실한 것이 좋지 않습니까?
당신은 그렇게 생각할 수 있습니다.
Some 키워드를 사용하여 모호한 방식으로 컴파일러에 알리는 경우
함수 내부에서는 반환되는 유형을 정확히 알 수 있지만 함수 외부에서는 함수가 반환할 인스턴스를 알 수 없습니다.
위의 예에서 someList는 같은 타입을 반환하지만 실제 반환 값은 완전히 다른 타입입니다.
이렇게 하면 코드를 변경해야 할 경우 함수 외부의 코드를 변경할 필요 없이 함수 내부만 변경할 수 있습니다.
# 참조된 사이트
