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함수를 하나 만들고 Shape 프로토콜 타입을 리턴 시킨다.
그리고 Square()을 return 하면 잘 실행이 된다.
해당 예제에서는 some 키워드를 사용하지 않아도 정상적으로 작동된다.
위 함수처럼 return 값이 Shape가 아닌 Square인 경우 return 되는 값을 정확하게 알 수 있지만
Shape를 return 되는 경우 함수 내부에서 Square이거나 Circle을 return 할 수 있게 된다.
다른 예제를 한 번 더 알아보자
//1
func someList() -> some Collection{
return [1,2,3]
}
//2
func someList() -> some Collection{
return [1 : "a", 2 : "b", 3 : "c"]
}
간단한 예제인데 someList() 함수에서 Collection을 return 한다고 선언하고 return을 배열[1,2,3]을 했을 때 some 키워드가 없는 경우
[Use of protocol 'Collection' as a type must be written 'any Collection']의 오류가 발생한다. 따라서 some 키워드를 이용하여 return 값을 불분명하게 컴파일러에게 알려주고 return 타입을 숨길 수 있다.
불분명하게 하면 안 좋은 거 아닌가?
라는 생각이 들 수 있다.
Some 키워드를 사용하여 불분명하게 컴파일러에게 알려주는 경우
해당 함수 내부에서는 return 되는 타입을 정확하게 알 수 있지만 함수 외부에서 해당 함수가 어떤 인스턴스를 반환하는지 알지 못한다.
위 예제에서 someList는 같은 타입을 반환하지만 실제 return 값은 타입이 완전히 다른 값이다.
이렇듯 코드를 수정할 일 생기는 경우 함수 밖의 코드들을 수정할 필요가 없고 함수 내부만 수정할 수 있게 된다.
# 참고한 사이트
'iOS > Swift 상식' 카테고리의 다른 글
Codable (0) | 2023.06.26 |
---|---|
Result Type (0) | 2023.03.25 |
property wrapper (0) | 2023.03.10 |
defer (0) | 2023.03.09 |
Extension 이란? (0) | 2023.03.08 |