🌊
SwiftUIのListが内部的にUIKitであることを確認する方法
はじめに
- ひょんなことから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
のサブクラスであることが読み取れる。
- またSwiftUIのViewであれば
CGDrawingView
となっている。 -
CGDrawingView
はSwiftUIのビューを表示するプライベートAPIとのこと - 逆説的に
CGDrawingView
でなければUIKitということが言える
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のサブクラスで内部的な型。
}
}
}
- また実際にビルドしなくても、Documentation/SwiftUIIntrospect/ListTypeのようにドキュメントから確認できる。
参考
- iOS16のときにリリースノートに載ってた?(リンク切れ)
Discussion