カルボナーラ街道

計測と観察

SwiftUIのTextEditorの実体がUIKitのUITextViewであることを確認する

本記事は以下記事の内容を参考にしています。

qiita.com


開発環境

# Xcode
> xcodebuild -version
Xcode 13.1
Build version 13A1030d

# lldb
(lldb) version
lldb-1300.0.32.4
Swift version 5.5.1-dev

はじめに

tokizuoh.hatenablog.com

(as TextEditor is actually UITextView) https://stackoverflow.com/questions/64591082/add-horizontal-padding-to-texteditor-but-prevent-it-from-shifting-scrollbar-insi

以前書いた記事で参考にしたStack Overflowの一節について、言及されている公式のソースがどこにも見当たらなかった。
社内で聞いたところ下記記事を共有してもらったので読む。

結論

import SwiftUI

struct ContentView: View {
    
    @State private var text: String = ""
    
    var body: some View {
        TextEditor(text: $text)
            .frame(width: 250,
                   height: 250)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

(lldb) expr -l objc++ -O -- [[UIWindow keyWindow] recursiveDescription]
<UIWindow: 0x7fb30f707c70; frame = (0 0; 428 926); gestureRecognizers = <NSArray: 0x600002b5c0c0>; layer = <UIWindowLayer: 0x600002b23f00>>
   | <UITransitionView: 0x7fb2ff706590; frame = (0 0; 428 926); autoresize = W+H; layer = <CALayer: 0x600002514fc0>>
   |    | <UIDropShadowView: 0x7fb2ff706f00; frame = (0 0; 428 926); autoresize = W+H; layer = <CALayer: 0x6000025151a0>>
   |    |    | <_TtGC7SwiftUI14_UIHostingViewGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x7fb318008e60; frame = (0 0; 428 926); autoresize = W+H; gestureRecognizers = <NSArray: 0x600002b221c0>; layer = <CALayer: 0x60000251bf20>>
   |    |    |    | <_TtGC7SwiftUI16PlatformViewHostGVS_P10$1188f044832PlatformViewRepresentableAdaptorVS_15UIKitTextEditor__: 0x7fb31800cb80; frame = (89 344.667; 250 250); anchorPoint = (0, 0); tintColor = UIExtendedSRGBColorSpace 0 0.478431 1 1; layer = <CALayer: 0x600002578cc0>>
   |    |    |    |    | <UITextView: 0x7fb2ff81b000; frame = (0 0; 250 250); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600002b45aa0>; layer = <CALayer: 0x600002515c00>; contentOffset: {0, 0}; contentSize: {250, 38}; adjustedContentInset: {0, 0, 0, 0}>

最下部にframeの値が一致しているUITextViewがあることが分かる。
おそらくTextEditorは内部的にUITextViewを使っているだろう、ということが分かった。(公式からの発表はないので断定はできない)

lldb

(lldb) expr -l objc++ -O -- [[UIWindow keyWindow] recursiveDescription]

lldbについて見ていく。
poぐらいしか普段使わないので現状全く分かってない。

expr

式の評価を行う。 expr, expression どちらも同じ実行結果を得られた。

(lldb) help
# 省略
  expression        -- Evaluate an expression on the current thread.  Displays
                       any returned value with LLDB's default formatting.
(lldb) expr int $hoge = 5
(lldb) po $hoge
5

expr -l objc++

言語objc++を利用することをデバッガーに指示する。

(lldb) help <source-language>
<source-language> -- One of the following languages:
                       c89
                       c
                       ada83
                       c++
                       cobol74
# 省略

利用できる言語結構あった。

-O

  • -O: –one-line-before-fileエイリアス
  • --one-line-before-file <command>: コマンドラインで提供されたファイルがロードされる前に、この1行のlldbコマンドを実行するようにデバッガーに指示

よく分からなかった。宿題。

-- (ハイフン2つ)

オプションの終了位置。

同じ結果が得られたコマンド

po [[UIWindow keyWindow] recursiveDescription]

Xcodeで利用するlldbコマンドは暗黙的にObjective-CとSwiftが指定されているっぽい。(嘘かも)

参考