[Swift] some 키워드 언제 쓰면 좋을까?

OQ·2022년 3월 30일
1

Swift

목록 보기
6/11
post-thumbnail

some 키워드 왜 쓰이는걸까?

그냥 SwiftUI에서 자주 쓰이는 뭐... 알게뭐람...

struct MyFirstView: View {
  var body: some View {
    Text("Hello world!")
  }
}

위와 같은 코드에서 'some'이란 키워드를 자주 접해보았을 것이다.
일단 'some'이 뭔지 알아보자.

some 키워드는 Swift 5.1의 새로운 기능입니다.
some 키워드는 computed property인 body안에 불투명한 타입이 있음을 나타냅니다.

여기서 불투명한 타입이란?

protocol Shape {
    func describe() -> String
}

struct Square: Shape {
    func describe() -> String {
        return "I'm a square. My four sides have the same lengths."
    }
}

struct Circle: Shape {
    func describe() -> String {
        return "I'm a circle. I look like a perfectly round apple pie."
    }
}

위와 같은 Shape란 프로토콜과 Shape를 따르는 여러 도형이 있다고 했을 때

func makeShape() -> Shape {
  return Circle()
}

이런식으로 정확히 무슨 도형을 리턴하는지 모르게 되는 경우를 뜻합니다.
즉 makeShape()는 불투명한 타입입니다.

참고로 Swift는 불투명한 타입을 리턴하는 것을 허용하지 않습니다.
위의 코드는 Protocol 'Shape' can only be used as a generic constraint because it has Self or associated type requirements 이라는 에러를 발생시킵니다.

그렇다면 에러가 나오지 않게하려면 어떻게 해야할까?
정답은 다음과 같습니다.

func makeShape() -> some Shape {
  return Circle()
}

some을 사용해주면 만사 해결!

타입을 미리 지정해서 함수의 내부를 변화시키는 제네릭 타입과는 정 반대로
함수 내부의 코드에 따라 구체적인 리턴 타입이 달라지게 됩니다.
아주 변화무쌍한 녀석이군요.

그런데 이거 왜 써야함???


some 키워드가 뭔지는 알았지만 이걸 굳이 왜 써야하는지 감이 오지 않습니다.

간다히 예를 들어보겠습니다.

고객이 어떠한 기능을 만들어 달라고 요청이 왔습니다.
고객: 배열 1, 2, 3을 리턴해 줘~

func testFunc() -> Array<Int> {
    return [1, 2, 3]
}

이렇게 힘들게 (힘들다고 칩시다) 기능을 만들어왔는데 고객이 갑자기 변심이 왔습니다.

고객: 아 미안해요 딕셔너리로 부탁해요~

이런 경우 testFunc()을 사용하는 다른 코드들도 수정을 해야하고 여러모로 화나게 됩니다.

이럴 때 some 을 써주면 됩니다!

// 고객 변심 전
func testFunc() -> some Collection {
    return [1, 2, 3]
}

// 고객 변심 후
func testFunc() -> some Collection {
    return ["a": 1, "b": 2, "c": 3]
}

testFunc() 의 내부 구현만 수정됐고 함수 밖에 내용은 수정할 필요 없게 됩니다.
이로서 testFunc()에 의존하는 다른 코드들도 수정할 필요 없게 되고 개발자는 해피해집니다!

이제 스유에서 some을 왜 썼는지 이해 되실겁니다.
만약 스유에서 some을 안 쓴다면 매번 함수 리턴값을 VStack, HStack, Button, Text 등등 구체적인 뷰값을 명시해줘야해서 아주 귀찮았을 겁니다.

profile
덕업일치 iOS 개발자

1개의 댓글

comment-user-thumbnail
2023년 6월 24일

재미나게 글 잘 읽고 갑니다.

답글 달기