۴ نکته مهم از SwiftUI

سلام به همگی و به اولين نوشته من در ویرگول خوش اومدید. اگر کم و کاستی هست به بزرگی خودتون ببخشید چون معمولا اولین کارها عالی نیستند.سعی می‌کنم همزمان با یاد گرفتن SwfitUI بلاگ های آموزشی هم منتشر کنم تا هم شروعی باشه برای تولید محتوا و هم اینکه همیشه مصرف کننده نباشم :)مقدمهفریم ورک SwiftUI در کنفرانس سالانه WWDC اپل در سال ۲۰۱۹ معرفی شد و در کنفرانس امسال (۲۰۲۰) هم ویژگی های جدیدی بهش اضافه شد. اپل و برنامه نویسان iOS همگی معتقد هستند که آینده برنامه نویسی در این پلتفرم به این فریم ورک وابستگی زیادی خواهد داشت به این دلیل که این فریم ورک شیوه جدیدی نسبت به فریم ورک های قبلی اپل دارد و با زحمت خیلی کمتری می‌توانیم برنامه هایی برای دستگاه های مختلف اپل با یک سورس کد توسعه دهیم.فریم ورک Declarativeاگر تا به حال به مستندات اپل و یا بلاگ پست های آموزشی بقیه درباره SwiftUI دقت کرده باشید این کلمه و ویژگی Declarative بودن را زیاد دیدید. برای توضیح این شیوه بهتر هستش که اول مروری بر شیوه توسعه رابط کاربری در فریم ورک UIKit بندازیم.فریم ورک UIKit یک فریم ورک imperative هستش به این معنی که برنامه نویس باید برای تمام جزئیات رابط کاربری برنامه و یا تغییرات مختلف و در کل هر جز کوچک از برنامه کد بنویسه و همه چیز را تحت کنترل داشته باشه که باعث میشه نیاز به کد های زیادی باشه.اما Declarative (اخباری-اطلاعی :| ) بودن به این معنی هستش که برنامه نویس فقط کافیه اجزای مختلف رابط کاربری و چیدمان کلی را بنویسد و خود فریم ورک خیلی از جزئیات را مدیریت می‌کند که در نتیجه تعداد خط کد ها و پیچیدگی بسیار کمتری نسبت به UIKit داریم و کار برنامه نویس برای طراحی رابط های کاربری پیچیده به شدت راحت شده است و حتی کد ها خیلی راحت تر قابل نگهداری هستند.پس اگر هنوز کدنویسی با SwiftUI رو شروع نکردید در نظر داشته باشید که با طرز فکری کاملا متفاوت با UIKit روبرو خواهید شدهمه چیز یک Viewاصلی ترين type موجود در این فریم ورک View است. هر element و هر بخش از رابط کاربری که در این فریم ورک موجود است از نوع View می‌باشد. در کل هرچیزی که در صفحه به نمایش درمیاد View هستش حتی رنگ ها.خب حالا تغییراتی که به این view ها میدیم چطور انجام میشه؟Modifiersبرای هر view می‌تونیم تغییرات مختلفی را اعمال کنیم به عنوان مثال به کد زیر دقت کنید :import SwiftUI struct ContentView: View { var body: some View { Text(&quotHello, World!&quot) .font(.title) .foregroundColor(.white) } }متن ما با Text که یک View هست نمایش داده میشه و تغییرات مختلفی که نیاز داریم را با modifier ها اعمال می‌کنیم. View های مختلف modifier های مخصوص به خودشون را دارند که برای آشنایی بیشتر می‌تونید لیست کامل modifier های هر view را در preview سمت راست Xcode مشاهده کنید.اما در اصل این modifier ها تغییرات را چطور اعمال می‌کنند؟ modifier ها با اضافه شدن به View اون ها را تغییر نمی‌دهند در اصل یک View جدید با تغییرات جدید که اضافه شده درست می‌کنند و جایگزین View قبلی می‌کنند. به کد بالا دقت کنید‌ که اولین modifier فونت را تغییر می‌دهد و View جدید را جایگزین قبلی می‌کنند و modifier بعدی هم به همین ترتیب.حالا این نکته چه اهمیتی داره؟ با توجه به نوع عملکرد modifier ها و جایگزین کردن View ها، ترتیب و اولویت اضافه کردن آنها اهمیت دارد یعنی امکانش هست که یک View با چند modifier ثابت ولی با اولویت های مختلف نتیجه متفاوتی را به نمایش بزاره.روابط بین View هامثل خیلی از مباحث که در برنامه نویسی داریم، رابطه بین View ها باهمدیگه رابطه Parent-Child هستش به طوری که modifier هایی که به Parent View اضافه می‌کنیم بر همه Child View ها هم تاثیر می‌گذارد.البته اگر یک modifier به Parent اضافه شود می‌توان همان modifier را با ورودی مختلف بر Child ها override کرد. به کد زیر دقت کنید : import SwiftUI struct ContentView: View { var body: some View { VStack { Text(&quotHello World&quot) .font(.largeTitle) Text(&quotHello World&quot) Text(&quotHello World&quot) Text(&quotHello World&quot) }.font(.title) } } در کد بالا ۴ Text فرزند VStack در نظر گرفته می‌شوند و برهمگی modifier فونت title وارد می‌شود بجز Text اول که فونت largeTitle را override کرده است.تغییرات View با تغییرات Dataیکی دیگر از بزرگ ترين تفاوت های بین UIKit و SwiftUI حذف View Controller ها و شیوه جدید برای تغییرات View از طریق تغییرات Data هستش. برای درک بهتر این موضوع خیلی مهم مرور دوباره ای به روش کار در UIKit بندازیم. ما در UIKit می‌توانیم به طور مستقیم از طریق (Outlet) ها View های مختلف را تغییر دهیم اما همچین رویکردی در SwiftUI وجود ندارد به طوری که برای تغییر هر View باید دیتایی که به آن وابسته هست را تغییر دهیم که این کار را به کمک فریم ورک Combine و property wrapper ها انجام می‌دهیم.SwiftUI Data Flowامیدوارم این پست برای کسایی که قصد دارند کار با SwiftUI را شروع کنند مفید باشه. خیلی خوشحال میشم اگر نظر یا انتقادی دارید کامنت بزارید. ممنون بخاطر وقتی که گذاشتید :)چند منبع خوب برای یادگیری SwiftUI : مستندات اپل100Days of SwiftUI راه های ارتباطی من