🌊

SwiftUIのListが内部的にUIKitであることを確認する方法

2023/11/06に公開

はじめに

  • ひょんなことからSwiftUIのListがUIKitであることを知り、それを調べる方法をXで教えていただきました。

View Hierachyによる確認

  • 下記のような適当なViewを作成しビルドして実行。
struct ContentView: View {
    var body: some View {        
        VStack {
            List {
                Text("Item 1")
                Text("Item 2")
                Text("Item 3")
            }
            Text("Hello, SwiftUI")
        }
    }
}
  • 下記を選択しView Hierarchyを表示してViewの詳細をデバッグすることができる。

  • Listを指すUpdateCoalescingCollectionViewをPrintして詳細をみると、baseClassがUICollectionViewとある。
  • つまりはこれがUICollectionViewのサブクラスであることが読み取れる。

SwiftUIIntrospectによる確認

  • またはswiftui-introspectというライブラリで確認ができる。
    • (このライブラリは型の確認というよりは、SwiftUIのビューではなくUIKitとして扱いたい際に使うのが本筋そう)
import SwiftUI
import SwiftUIIntrospect

struct ContentView: View {
    var body: some View {
        List {
            Text("Item 1")
            Text("Item 2")
            Text("Item 3")
        }
        .introspect(.list, on: .iOS(.v13, .v14, .v15)) {
            print("🐱")
            print(type(of: $0)) // UITableView(iOS17でビルドしているので今回Printされない)
        }
        .introspect(.list, on: .iOS(.v16, .v17)) {
            print("🐶")
            print(type(of: $0)) // 「UpdateCoalescingCollectionView」がPrintされる。これはUICollectionViewのサブクラスで内部的な型。
        }
    }
}

参考

  • iOS16のときにリリースノートに載ってた?(リンク切れ)

Discussion