[WWDC19] some
Table of contents
🎵가끔씩 나도 모르게 짜증이나~
너를 향한 이 맘은 변하지 않았는데 혹쒸~~ 내가 이상한걸까 🎶
내 이걸 아는 당신 그 Some이 맞습니다.
우리가 연애하는 썸만큼 달달하지 않지만 코딩할 땐 달달한 Swift의 some에 대해서 알아보자.
Some SwiftUI를 하다보면 굉장히 자주 볼 수 있음
var body: some View {
/* Any View */
}
이렇게 되어있는 SwiftUI View들을!
모를 땐 뭐다? 공식 문서를 보자!
하지만 따따디씨 2019에서 새로 나온 개념이기에 도입된 배경까지 알 수 있으니 WWDC 2019를 보자!
WWDC 2019 - What's New in Swift
// Shapes Example
protocol Shape { /* ... */ }
struct Square: Shape { /* ... */ }
struct Circle: Shape { /* ... */ }
struct Oval: Shape { /* ... */ }
struct Union<A: Shape, B: Shape>: Shape { /* ... */ }
struct Transformed<S: Shape >: Shape { /* ... */ }
struct FaceShape {
/* Something else */
var shape: Shape { // ⬅️ Shape
switch faceType {
case .round:
return Circle()
case .square:
return Square()
case .diamond:
return Transformed(Square(), by: .fortyFiveDegrees))
default:
return Oval()
}
}
}
자 여기서 <= Shape는 문제가 될까?
문제 없다. 반환되는 모든 값들이 Shape Protocol을 따르고 있기 때문이다.
자 그럼 Union을 통해서 새로운 도형을 만들어보자.
기존 사각형 + 45도 돌린 사각형을 Union 하여 8각이 있는 스타 Shape를 만들어보자.
struct EightPointedStar {
…
var shape: Union<Square, Transformed<Square>> {
return Union(Square(), Transformed(Square(), by: .fortyFiveDegrees))
}
}
여기서 Shape 타입이 문제가 될까?
문제 없다. 코드상 문제는 없다.
다-만 사용자의 입장에서는 문제가 될 수 있다.
아 8개 각이 있는 스타 얻어야지!
EightPointStar 구조체 선언하고
shape 연산 프로퍼티를 사용하면 8개 각이 있는 별 모양의 shape가 나오겠지!
하지만 결과는 Union 타입.
사용하는 입장에서는 또 공부를 해야한다.
Shape처럼 작동하긴 하는데 Union은 또 뭔데??
엥 그럼 그냥
struct EightPointedStar {
…
var shape: Shape {
return Union(Square(), Transformed(Square(), by: .fortyFiveDegrees))
}
}
이렇게 코드 짜면 되는거 아님?
응 안돼!
왜??
프로토콜 타입이 return 된다면 같은 값을 return한다는 보장이 없다.
만약 같은 API에 각기 다르게 API를 호출했다면 같은 값이여야 함 -> 하지만 값 자체를 비교하지 못함 왜? 프로토콜 타입이니깐
짜잔!🎉 그래서 나온 타입이 some
some
위 예시에서 알 수 있듯이 some을 사용하는 이유는 다음과 같이 사용할 수 있다.
(함수)사용자 입장에서 불분명한 타입을 반환하여 내부구조로 어떤 것이 반환되는지 정확하게 알 수 없도록 하는 타입.
음 사용자에게 정확하게 알 수 없는게 과연 좋은걸까? 생각했음
근데 사용할 입장에서는 때론 정확하지 않은게 좋을 수 있음
왜???
struct EightPointedStar {
…
var shape: Union<Square, Transformed<Square>> {
return Union(Square(), Transformed(Square(), by: .fortyFiveDegrees))
}
}
위 예시 처럼 some
을 사용하지 않고 저렇게 Union
을 반환시켜도 됨
하지만 저 Square가 아닌 Circle이 들어간다면? 저걸 다 하나 하나 다 선언해줘야함
struct EightPointedStar {
…
var shape: Union<Circle, Transformed<Square>> {
return Union(Circle(), Transformed(Circle(), by: .fortyFiveDegrees))
}
}
이렇게 이건 너무 불-편해
난 그저 Shape가 사용하고 싶을 뿐인데...
그래서 불분명한게 좋을 수 있는 거임
struct EightPointedStar {
…
var shape: some Shape {
return Union(Square(), Transformed(Square(), by: .fortyFiveDegrees))
}
}
이러면 아무것도 묻지도 않고 따지지도 않고 Shape 사용 가능