본문 바로가기

iOS

SwiftUI - some 키워드에 대한 정리

2020 WWDC를 보면서 SwiftUI로 이제 대부분의 애플의 앱들이 설계되고

Widget이랑 AppClip이라는 새로운 것들이 나타나면서

이제는 공부를 해야겠다는 생각이 들어서 시작하게 되었는데

처음 시작 부분부터 막히기 시작하였다

그것은 바로바로

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello World")
    }
}

이 부분에서 some 키워드에서 막혔다

 

swift의 문법적인 부분인 것 같기는 한데 swift의 모든 문법을 다 알고 있지는 않은 터라 알 수가 없어서 구글에서 알아봤어요

제가 참고한 블로그가 있는데

궁금하신 분들을 위해서 아래쪽에 링크를 남겨 두었으니 필요하신 분은 보시면 될것 같아요 ㅎ


제가 이번에 말씀드릴 것은 제가 이해한 내용을 바탕으로 결론만 남길려고 해요

 

some이라는 키워드는 명확하지 않은 타입(ex. associatedType or Self)이 프로토콜에 정의되어 있고

함수나 연산 프로퍼티를 만들어서 이 프로토콜을 반환 타입으로 가지고 싶을 때

아직 명확하지 않은 타입(opaque type)이라서 컴파일 과정에서 오류가 발생하게 되는데

그 오류를 없에기 위해서는 타입을 명확하게 만들어 줘야 하는데

그 역할을 해주는 것이 some 키워드이다

이것을 쓰게되면 컴파일러에게 이 함수 또는 연산 프로퍼티는 동일한 명확한 타입을 가진 값만을 반환한다는 것을 알려주는 것이다


swiftui에서 body라는 연산 프로퍼티를 보면 var body : some View라고 선언되어 있는데

여기에서 some이라는 키워드를 작성한 이유는 Text, Image등 다양한 view 프로토콜을 만족하는 구조체가 존재하는데

얼마나 많은 구조체들이 선언될지 알 수 없으니깐

some이라는 키워드를 붙여 줌으로써 다양한 구조체들을 생성하고 없에고 할 수 있는 것이다

 

import SwiftUI

struct ContentView: View {
    var body: Text {
        Text("Hello World")
    }
}

위에 코드 처럼 body가 명확한 Text 구조체를 반환타입으로 가진다고 명시해 주었기 때문에 따로 some키워드를 작성하여 줄 필요가 없다

 

하지만 아래의 코드처럼 작성을 하게되면

import SwiftUI

struct ContentView: View {
    var body: Text {
        VStack(content: {
            Text("Hello World")
        })
    }
}

이러한 에러 메세지를 Cannot convert return expression of type 'VStack<Text>' to return type 'Text' 마주하게 됩니다

이유는 body의 타입을 Text로 명시해 주었기 때문인데요

VStack을 반환하기 위해서는 body : VStack<Text>로 선언을 해주어야 하는데

body의 내용을 바꿀때 마다 이렇게 해주어야 한다면 매우 귀찮을것 같다는 생각이 드네요 ㅎㅎ

 

그래서 아래의 코드처럼 some키워드를 붙여주게 되면

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(content: {
            Text("Hello World")
        })
    }
}

오류를 보지 않고 다양한 view 프로토콜을 준수하는 구조체를 사용할 수 있게 되네요 :)


그래서 결론은 some은 컴파일러에게 이것은 concrete type을 반환한다고 확신을 주는 키워드라고 볼수있겠네요

 

부족한 글이지만 읽어주셔서 감사합니다!!

혹시나 틀리거나 부족한 점이 보인다면 댓글로 부탁드릴게요 ㅎ

 

 

https://medium.com/@PhiJay/whats-this-some-in-swiftui-34e2c126d4c4

 

What’s this “some” in SwiftUI?

An Intuitive Explanation of The New Opaque Return Type

medium.com

'iOS' 카테고리의 다른 글

Swift - UIStackView  (0) 2020.08.03
iOS12버전 호환되게 만들기  (0) 2020.07.16
Swift - 달의 첫날과 마지막날 알아내기  (0) 2020.06.20