[Swift] TextKit2 の理解(主要クラスその1)

Foundation

TextKi2 も いつもどおり(?) Document は充実していなくて、WWDC でのビデオ説明がほぼ全てなので、自分でまとめてみます。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Monterey 12.1 Beta
  • Xcode 13.1
  • iOS 15

TextKit2 概要

機能の概要ではなく、関連 class/struct/enum をまとめてみようと思います。

# 当初は、上記の考えだったのですが、結局 Apple のドキュメントをまとめ直す形になってます・・・・

MEMO
TextKit2 のドキュメントを読んでいると、AppKit から辿っても、UIKit にたどり着くことがよくあります。

これは、おそらく同一のクラス等を使用しているためだと思うので、気にしないことにしました。

Data Management

3つのクラスが登場します。関連性は以下の通りです。

classDiagram NSTextContentManager --|> NSObject NSTextContentStorage --|> NSTextContentManager NSTextContentStorage --|> NSTextStorageObserving : protocol NSTextStorage --|> NSMutableAttributedString NSTextContentStorage *-- NSTextStorage: textStorage

NSTextContentManager

text document を管理する抽象クラスであり、デフォルト実装も提供するクラス

NSTextContentStorage

NSTextContentManager を継承したクラス。
NSTextStorageObserving protocol にも準拠。
NSTextContentStorage は、高々1つしかサポートされない。
textStorage が値を持っている時(nil でないとき)は、attributedString プロパティは、無視される
デフォルトでは、NSTextStorage を保管要素として初期化される。

NSTextStorage

システムによって管理されている text を保管するための 基本的な仕組みを提供する。

NSMutableAttributedString の サブクラス。そのまま使っても良いし、さらにサブクラス化しても良い。

このクラスを使って、テキストと(複数の)レイアウトマネージャーが関連づけられる。
文字や属性に変更があった時には、このクラスが、変更を レイアウトマネージャに通知する(それをトリガーとして 再表示等が行われる)

注意1:どのスレッドからアクセスしても良いが、同時アクセスは1つであることを App 側が保証すること。

注意2:macOS では、characters, words, paragraphs を使ってアクセスできるが、効率良くない。すなおに、NSMutableAttributedString や NSMutableString 等を使って、character レベルの変更を行うこと。

サブクラス化して使用する時の注意

このクラスは、beginEditing, endEditing を使った変更管理や NSAttributedString の属性についての妥当性チェック、Delegate 処理、レイアウト通知もしています。

しかし、実際の AttributedString storage は、特別な管理はしていない。必要であれば、NSAttributedString の string, attributes を継承クラスで override することで管理する。

サブクラスは、replaceCharacters, setAttributes も override しなくてはいけない。これらは、実際に変更した後に、edited(_:range:changeInLength:) をコールして変更を 親クラスに通知する必要がある。

メモ

何言ってるかサッパリだと思いますが、その通りです。

内部の振る舞いの説明はなく、主要クラスの概要情報のみが提供されているだけなので、少しづつ ひもとく必要がありそうです。

まとめ:TextKit2 その1

TextKit2 の理解(主要クラスその1)
  • 対象文字列を管理する抽象クラスは、NSTextContentManager (デフォルト実装も提供)
  • 対象文字列を管理する具象クラスは、NSTextContentStorage (NSTextStorageObserving にも準拠)
  • 対象となる文字列を 保管してくれるのは、NSMutableAttributedString を継承した NSTextStorage

しばらく続きます。

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です