iOS 응용 (swift)
[iOS - swift] any vs some 키워드 (dynamic dispatch, static dispatch, type erase)
jake-kim
2024. 2. 2. 00:32
any와 some 키워드
- any와 some키워드는 type erase 방법
- type erase: 코드의 추상화를 위해서 구체적인 타입을 지우는 것
- 3가지 메소드의 차이점?
protocol P {}
func f1(p: P) {
}
func f2(p: any P) {
}
func f3(p: some P) {
}
- any와 some 모두 type erase 방법들이고 swift에서는 각각 쓰임새가 존재
- any는 existential type에서 사용하는 키워드
- some은 주로 return type에 사용하는데 some키워드를 사용하면 컴파일 시점에 static dispatch로 동작
- (existential type 개념은 이전 포스팅 글 참고)
ex) SwiftUI에서도 some키워드로 body의 타입을 명시하는데 이것은 어떤 뷰든지 View형태로만 값을 가져온다는 추상화와 동시에 성능상으로도 이점을 가져갈 수 있음
struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
}
.padding()
}
}
정리
- any는 parameter에만 사용하고 성능 최적화를 위한다면 지양할 것 (dynamic dispatch)
- some은 return 타입에 사용할 것
- (some키워드 없이 protocol 형태로 반환한다면 dynamic dispatch가 되므로 some키워드를 붙여서 static dispatch되도록 사용)
* 참고
- https://github.com/apple/swift-evolution/blob/main/proposals/0352-implicit-open-existentials.md