
2026/05/17 20:49
ネイティブまで徹底し、必要なテキストが表示されるまで続けます。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
日本語翻訳:
(ここに原文を貼り付け)
翻訳するテキスト
(必要に応じて;なければ、元の文章を繰り返す):サマリー(オリジナル)
本文
私は、ほぼ 20 ヶ年以上にわたりネイティブの macOS/iOS デベロッパーとして活動してまいりましたが、よくある「また Node.js/Electron か…残念なことです」といった反応について、いくつかご発言しておきたいことがあります。
最近、純粋な SwiftUI/Swift を用いて、Markdown 機能を備えたシンプルなチャットアプリの実装を試みました。正直に申し上げますと、「ネイティブ」と称される技術が、単純な画面表示を超えた領域に至るほど未熟である様は、なんと滑稽なのかと思います。確かに SwiftUI で合理的なパフォーマンスを実現することは可能であり、スクロール時のわずかな揺れや、ここぞという場面での数回の遅延程度であれば許容範囲だと自欺するまでもあります。しかし、そうすると今度は SwiftUI プライミティブによって構築された全体としての Markdown ドキュメントの選択が不可能となり、設計上そのように仕組まれていることに直面することになります。
そこで、経験と知恵を頼りに NSTextView に切り替えます。しかも現在は TextKit 2 をサポートしており素晴らしいことです。しかしながら、これによりこれまでの SwiftUI 側で得られていたテストやパフォーマンス改善の恩恵の多くを失ってしまいます。なぜなら、これは SwiftUI と相性が悪いためです。次に、テキストストリーミングに対応させるため、AppKit への移行を検討します。今が 2026 年で、AI モデルからのレスポンスストリーミングは当たり前の時代ですからね。その結果、CPU のスパイクが発生し始めます。まあ、仕方がありません。AppKit はまだあります。NSCollectionView もそうです。成熟し、高性能で、戦火をくぐって生き残ってきたものです。それらを採用して再び実装を開始しましたが、翌日にはセルが点滅してしまうという設計上の問題を発見することになります。
さらに、純粋な TextKit 2 でより低レベルのアプローチを試すことも考えます。プロトタイプを作成しましたが、パフォーマンスは概ね良好でありながら、ストリーミング処理は依然として問題です。現代的な環境とも相性が悪く、SwiftUI を完全に廃止して AppKit に固執し、テキストチャンクの手動拡張にも取り組むことになりました。この段階ではほぼすべての機能が破綻していますが、なんとテキスト選択は可能でした!
すると、単純な macOS ネイティブの振る舞い(コンテキストメニュー、辞書検索、選択操作、アクセシビリティ、テキストインタラクション、ユーザーが考慮せずに期待するあらゆる細かい機能)に達するだけで数ヶ月もかかることに気づきます。
そこで WebKit を Markdown 表示のために試してみます。確かに若干の制限はありますが、概ね動作し、パフォーマンスも良好です。タイポグラフィもほぼ完璧であり、適切なレベルの制御が可能です。
そして、最も絶望的な瞬間に来た時です。こう考えました:「よし、簡単な Electron プロジェクトを作成してみよう」。ダークサイドへと進みました。驚きだったのは、テキスト操作、Markdown のレンダリング、優れたタイポグラフィ——これら全てが即座に動作し、純粋な TextKit 2 インプリメンテーションでは得られなかったようなパフォーマンスを備えていることです。macOS との統合機能も充実しており、数行のコードで精巧な Git の差分まで描画できます。diffs.com などの高級機能についてはさらにお話ししません。
そこでふと自問しました:「いったい何が間違っていたのでしょうか?」
- みんなが言うべきことをすべて実行しています(ネイティブ一貫性)。
- プラットフォームの仕組みを知っています。
- アプローチの選択肢を知っています。
- SwiftUI、AppKit、TextKit、WebKit についても理解しています。
それでもなお、チャットと Markdown 表示を備え、メッセージ全体を選択可能なといったシンプルな機能を実装することに失敗してしまいました。
すると突然、この時代の最も重要な UI パターンの一つである「チャット」「長文リッチテキスト」「柔軟なタイポグラフィ」に依存する新しいチャット主導型アプリの多くが、いずれかの形で Web ベースとなっている理由がはっと明らかになりました。
- 真の代替手段は存在しません。
SwiftUI はシンプルな画面には適しており、特に大幅なスクロールのない場合ほど望ましいです。Swift も依然としてパフォーマンス重視の部分には最適です。しかしながら、そのほとんどを Electron や React Native から無料で獲得でき、ネイティブとの相互運用性を保ちつつ、はるかに優れたテキストモデルとレンダリングを実現できるのです。
したがって、もはや「急場しのぎの解法か、適切な解法か」という議論では済みません。長文チャット向けのリッチテキストレンダリングを構築したい場合、 SwiftUI や Apple のネイティブ SDK は助けにはなりません。それらは利点から制約へと変化してしまいます。
P.S. Hacker News での議論
P.P.S. Lobsters での議論