Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] any vs some 키워드 (dynamic dispatch, static dispatch, type erase) 본문

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가지 메소드의 차이점?
    • 3가지 모두 런타임에 타입이 결정되므로 dynamic dispatch로 동작
    • f2는 any를 붙여줌으로써 프로토콜을 사용하면 dynamic dispatch가 될것이라는 것을 명시적으로 표현했고 Swift6.0부터는 any키워드를 붙이지 않으면 컴파일 에러가 나게 변경 예정 (참고)
    • f3도 원래는 사용하던 시점이 있었지만 any가 등장하면서 some을 any로 써도 무방하게끔 변경됨 (참고)
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

Comments