iOS/Swift 상식

Some

HJ39 2023. 3. 25. 17:45

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 값은 타입이 완전히 다른 값이다.

 

이렇듯 코드를 수정할 일 생기는 경우 함수 밖의 코드들을 수정할 필요가 없고 함수 내부만 수정할 수 있게 된다.

 

 

# 참고한 사이트

  1. https://minosaekki.tistory.com/38
  2. https://velog.io/@haze5959/Swift-some-%ED%82% A4% EC% 9B% 8C% EB%93%9C-%EC%96% B8% EC% A0%9C-%EC%93% B0% EB% A9% B4-%EC% A2% 8B% EC% 9D%84% EA% B9%8C

'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