some 키워드?
SwiftUI를 공부하며 많이 본 키워드이지만 난 아직 SwiftUI를 깊게 공부하지 않는다 하지만 일단 한번 본다면
- some키워드는 Swift5.1의 새로운 기능이다.
- some 키워드는 연산프로퍼티인 body안에 불투명한 타입이 있음을 나타낸다??
some 키워드는 프로토콜을 준수하는 불투명한 유형을 리턴하기위해 프로토콜과 함께 사용될 수 있다.
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() -> some Shape{
// 내부로직에 의해서 런타임에 결정됨
if someCondition(){
return Circle()
}else{
return Square()
}
}
some이 필요한 이유?
개발 시 요청이 들어왔다.
요청: 1, 2, 3, 4, 5 를 갖고있는 배열을 리턴하는 함수를 만들어라.
func someFunction() -> Array<Int>{
return [1, 2, 3, 4, 5]
}
프로젝트에 변경 사항이 생겼다.
요청: 1, 2, 3, 4, 5 를 갖고있는 딕셔너리를 리턴하는 함수를 만들어라
func someFunction() -> [String: Int]{
return ["a": 1, "b": 2, "c": 3, "d": 4, "e": 5]
}
이렇게 변경된 경우 someFunction()을 호출하는 모든 코드들을 수정해야한다.
이런 경우 some을 써주면 된다.
func seomeFunction1() -> some Collection{
return [1, 2, 3, 4, 5]
}
func seomeFunction2() -> some Collection{
return ["a": 1, "b": 2, "c": 3, "d": 4, "e": 5]
}
Colletion이란 프로토콜을 따르는 인스턴스를 리턴한다?
someFunction이란 함수의 내부구현만 수정하면 되고 함수 밖의 내용은 수정이 필요없어진다.
func seomeFunction1() -> [String: Int]{
return ["a": 1, "b": 2, "c": 3, "d": 4, "e": 5]
}
func seomeFunction2() -> some Collection{
return ["a": 1, "b": 2, "c": 3, "d": 4, "e": 5]
}
**let a = seomeFunction1() // type: [String: Int]
let b = seomeFunction2() // type: some Collection**
some 사용하지 않으면 명시적인 타입을 정확하게 지정해야하는데, some키워드를 사용하면 명시적인 타입의 지정이 아니라? Collection프로토콜을 따르는 타입을 모두 포함한다.
스유에서는 이런 some을 적극적으로 활용한다고한다.
some을 사용해 매번 함수의 리턴값을 VStack, HStack, Button, Text등등 구체적인 뷰 값을 명시하지 않고 View라고.. 매우 편해보임