وقتی «نیتیو» دیگه کافی نیست: شکست SwiftUI در رندر متن
خلاصهٔ کاملتر
نویسندهی این مقاله نزدیک به ۲۰ ساله که روی پلتفرمهای اپل کار میکنه. اون سعی کرد یه چت ساده با قابلیت نمایش Markdown بسازه — چیزی که به نظر خیلی معمولی میرسه. ولی همین کار ساده تبدیل به یه کابوس چندمرحلهای شد.
اول SwiftUI رو امتحان کرد. اسکرول کمی ناهموار بود، ولی قابل تحمل. مشکل اصلی اینجا بود که انتخاب کردن (select) یه سند Markdown ساختهشده از المانهای SwiftUI اصلاً ممکن نیست — by design. یعنی از اساس پشتیبانی نشده.
بعد رفت سراغ NSTextView از AppKit که حالا از TextKit 2 هم پشتیبانی میکنه. ولی این انتخاب یعنی خداحافظی با بیشتر کارهایی که روی SwiftUI انجام داده بود، چون این دو تا با هم خوب کنار نمیان. وقتی هم خواست متن رو بهصورت stream (قطعهقطعه، مثل پاسخهای هوش مصنوعی) نمایش بده، CPU اپ پرواز کرد.
گزینهی بعدی NSCollectionView بود — بالغتر، پرفورمنس بهتر. اما سلولها بدون هیچ دلیل واضحی چشمک میزدن. باز هم by design. بعد یه پروتوتایپ با TextKit 2 خالص زد؛ پرفورمنس بهتر شد ولی streaming هنوز افتضاح بود و بقیهی چیزها خراب. در این مرحله متن قابل انتخاب بود، ولی context menu، dictionary lookup، اکسسیبیلیتی و دهها رفتار کوچیک دیگهای که کاربر بدون فکر انتظار داره، همه باید از صفر نوشته میشدن. ماهها کار.
بعد WebKit رو امتحان کرد. خوب کار کرد. typography تمیز بود. پرفورمنس قابل قبول بود. و بعد، در یه لحظهی تاریک، تصمیم گرفت Electron رو هم ببینه. نتیجه؟ شگفتزده شد. رندر Markdown، انتخاب متن، typography خوب، integrationهای macOS — همهچیز out of the box کار کرد. حتی پرفورمنسش از پیادهسازی خالص TextKit 2 بهتر بود.
نتیجهگیری نویسنده اینه که این دیگه بحث «راهحل سریع در مقابل راهحل درست» نیست. برای اپهایی که روی چت و متن غنی تکیه دارن، SwiftUI و SDKهای نیتیو اپل نهتنها کمک نمیکنن، بلکه تبدیل به محدودیت میشن. Swift برای بخشهای حساس به پرفورمنس هنوز عالیه، ولی مدل رندر متن وب بهوضوح بالغتره.
نکات کلیدی:
- انتخاب متن در Markdown نوشتهشده با SwiftUI ممکن نیست — این یه محدودیت طراحیه، نه باگ
- NSTextView با TextKit 2 با SwiftUI خوب کنار نمیاد و streaming متن رو بد مدیریت میکنه
- NSCollectionView مشکل چشمکزدن سلولها داره که راهحل سادهای نداره
- Electron در رندر متن، Markdown و typography از همهی گزینههای نیتیو بهتر عمل کرد
- برای اپهای چتمحور با متن غنی، وببیس بودن دیگه یه «انتخاب راحت» نیست، بلکه منطقیترین گزینهست




