Swift의 some과 any는 둘 다 프로토콜을 다루는 키워드지만, 사용 목적과 동작 방식이 완전히 다릅니다.
"구체적인 타입은 숨기되, 컴파일러는 정확히 어떤 타입인지 알고 있다"
func makeView() -> some View {
Text("Hello") // 컴파일러는 이게 Text라는 걸 정확히 안다
}
some View)// ❌ 에러: 반환 타입이 일관되지 않음
func makeView(condition: Bool) -> some View {
if condition {
return Text("Yes") // Text 타입
} else {
return Image("photo") // Image 타입 - 다른 타입!
}
}
"어떤 프로토콜을 따르는 타입이면 뭐든 OK, 런타임에 결정"
func makeView(condition: Bool) -> any View {
if condition {
return Text("Yes") // ✅ OK
} else {
return Image("photo") // ✅ OK - 둘 다 View 프로토콜 준수
}
}
let views: [any View] = [
Text("Title"),
Image(systemName: "star"),
Button("Tap") { }
] // ✅ 서로 다른 타입들을 배열에 담을 수 있음
| 특성 | some | any |
|---|---|---|
| 타입 결정 시점 | 컴파일 타임 | 런타임 |
| 반환 타입 일관성 | 항상 동일해야 함 | 매번 달라도 됨 |
| 성능 | 빠름 (Static Dispatch) | 약간 느림 (Dynamic Dispatch) |
| 주요 사용처 | 단일 타입 반환 | 다형성 필요시 |
| 타입 정보 | 컴파일러가 정확히 앎 | 런타임에만 확인 가능 |
struct ContentView: View {
var body: some View {
VStack {
Text("Title")
Image("logo")
}
// body는 항상 같은 뷰 구조를 반환
}
}
// 여러 종류의 애니메이션을 배열로 관리
let animations: [any Animation] = [
.easeIn,
.spring(response: 0.3),
.linear(duration: 1.0)
]
// 다양한 Shape를 담는 배열
let shapes: [any Shape] = [
Circle(),
Rectangle(),
RoundedRectangle(cornerRadius: 10)
]
body 프로퍼티some은 "성능과 타입 안정성"이 중요할 때, any는 "유연성"이 필요할 때 사용합니다.
some View를 사용any를 고려some 사용을 우선Swift 5.7부터 any 키워드가 명시적으로 필요하게 되어, 코드의 의도가 더 명확해졌습니다.