Guard برای خروج زودهنگام
پس از guard متغیر unwrapشده در ادامهٔ scope در دسترس است.
func greeting(for name: String?) -> String { guard let name, !name.isEmpty else { return "Hello, guest" } return "Hello, \(name)"}
مرجع پایه Swift برای ثابتها، optionals، ساختارها، collectionها و همزمانی. مقدارهای غایب را با Optional نمایش دهید و پیششرطها را با guard روشن کنید. نوع value و reference را متناسب با semantics انتخاب کنید. متدهای collection را برای تبدیل declarative استفاده کنید؛ closure را کوتاه و captureهای ناخواسته را کنترل کنید. از این صفحه بهعنوان مرجع سریع استفاده کنید و مثالها و نکتهها را با نسخهٔ ابزار، نیاز و شرایط واقعی پروژهٔ خود تطبیق دهید.
پس از guard متغیر unwrapشده در ادامهٔ scope در دسترس است.
func greeting(for name: String?) -> String { guard let name, !name.isEmpty else { return "Hello, guest" } return "Hello, \(name)"}enum میتواند دادهٔ وابسته به هر حالت را type-safe نگه دارد.
enum LoadState { case idle case loading case loaded([String]) case failed(Error)}struct برای مقدارهای مستقل و قابلکپی مناسب است.
struct Rectangle { var width: Double var height: Double var area: Double { width * height }}نتیجهٔ هر مرحله آرایهای تازه با نوع خروجی مشخص میسازد.
let visibleNames = users .filter { $0.isActive } .map(\.name) .sorted()Dictionary(grouping:by:) اعضا را براساس کلید دستهبندی میکند.
let usersByCity = Dictionary(grouping: users, by: \.city)reduce را برای aggregation با accumulator روشن نگه دارید.
let total = prices.reduce(0) { sum, price in sum + price}خطای دامنهای را با enum قابلبررسی تعریف کنید.
enum InputError: Error { case empty}func validate(_ value: String) throws -> String { guard !value.isEmpty else { throw InputError.empty } return value}await محل انتظار را در جریان کنترل آشکار میکند.
func loadProfile(id: Int) async throws -> Profile { let (data, _) = try await URLSession.shared.data(from: profileURL(id)) return try JSONDecoder().decode(Profile.self, from: data)}گروه taskها نتایج را جمع میکند و با scope والد lifecycle دارد.
let results = await withTaskGroup(of: Image?.self) { group in for url in urls { group.addTask { try? await loadImage(from: url) } } return await group.reduce(into: []) { $0.append($1) }}مقدار تغییرناپذیر را با let و مقدار متغیر را با var تعریف کنید.
نوع داده را از context استنباط کنید یا برای API عمومی صریح بنویسید.
مقدار احتمالی را با Optional نمایش دهید و امن با if let باز کنید.
از force unwrap فقط وقتی invariant قطعی است استفاده کنید.
برای دادههای ارزشی از struct و برای هویت مرجعی از class بهره ببرید.
آرایه، دیکشنری و مجموعه را با نوع عنصر مشخص بسازید.
الگوی guard را برای خروج زودهنگام و روشنکردن پیششرطها بهکار ببرید.
خطا را با throws و do/catch منتقل و مدیریت کنید.
ناهمگامی را با async/await و لغو task را آگاهانه مدیریت کنید.
چرخه عمر referenceها را بررسی کنید و تست را روی سناریوهای اختیاری و خطا اجرا کنید.
Optional را با if let یا guard let باز کنید و force unwrap را فقط در invariant اثباتشده نگه دارید.
برای انتقال داده میان taskها، قواعد Sendable و actor isolation را بررسی کنید.