그냥 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 키워드가 뭔지는 알았지만 이걸 굳이 왜 써야하는지 감이 오지 않습니다.
간다히 예를 들어보겠습니다.
고객이 어떠한 기능을 만들어 달라고 요청이 왔습니다.
고객: 배열 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 등등 구체적인 뷰값을 명시해줘야해서 아주 귀찮았을 겁니다.
재미나게 글 잘 읽고 갑니다.