فهرست سرفصل‌های Swift
خانه (Swift HOME) معرفی (Swift Intro) شروع به کار (Swift Get Started) سینتکس (Swift Syntax) دستورات (Swift Statements) خروجی (Swift Output) چاپ اعداد (Print Numbers) کامنت ها (Swift Comments) متغیرها (Swift Variables) چاپ متغیرها (Print Variables) چند متغیره (Multiple Variables) شناسه ها (Identifiers) ثابت ها (Constants) نمونه های دنیای واقعی (Real-Life Examples) انواع داده (Swift Data Types) اعداد (Numbers) بولی ها (Booleans) کاراکترها (Characters) تبدیل نوع (Swift Type Casting) عملگرها (Swift Operators) عملگرهای حسابی (Arithmetic Operators) عملگرهای انتساب (Assignment Operators) عملگرهای مقایسه ای (Comparison Operators) عملگرهای منطقی (Logical Operators) اولویت عملگرها (Operator Precedence) رشته ها (Swift Strings) اتصال رشته ها (Concatenation) اعداد و رشته ها (Numbers and Strings) کاراکترهای ویژه (Special Characters) یونیکد و اسکالرها (Unicode & Scalars) آرایه ها (Swift Arrays) حلقه روی آرایه (Loop Through an Array) برش های آرایه (Array Slices) اندیس ها و کران ها (Indices & Bounds) آرایه های چندبعدی (Multidimensional Arrays) نمونه های دنیای واقعی (Real-Life Examples) بازه ها (Swift Ranges) اگر...وگرنه (Swift If...Else) if (if) else (else) else if (else if) اگر...وگرنه کوتاه (Short Hand If...Else) if تو در تو (Nested If) عملگرهای منطقی (Logical Operators) نمونه های دنیای واقعی (Real-Life Examples) سوئیچ (Swift Switch) حلقه while (Swift While Loop) حلقه repeat/while (Repeat/While Loop) نمونه های دنیای واقعی (Real-Life Examples) حلقه for (Swift For Loop) حلقه های تو در تو (Nested Loops) حلقه for-each (For-Each Loop) نمونه های دنیای واقعی (Real-Life Examples) شکستن/ادامه (Swift Break/Continue) کالکشن ها (Swift Collections) ست ها (Sets) دیکشنری ها (Dictionaries) map، filter، reduce (map, filter, reduce) مرتب سازی (Sorting) تغییرپذیری (let دربرابر var) (Mutability (let vs var)) پروتکل های کالکشن (Collection Protocols) توابع (Swift Functions) اختیاری ها (Swift Optionals) enumها و الگوها (Swift Enums & Patterns) Closureها (Swift Closures) تاپل ها و نام های مستعار نوع (Tuples & Type Aliases) برنامه نویسی شیءگرا (Swift OOP) کلاس ها/اشیا (Classes/Objects) ساختارها (Structs) کلاس vs ساختار (Class vs Struct) ویژگی های کلاس (Class Properties) متدهای کلاس (Class Methods) کلیدواژه self (self Keyword) ارث بری (Swift Inheritance) چندریختی (Swift Polymorphism) پروتکل ها (Swift Protocols) جنریک ها (Swift Generics) اکستنشن ها (Swift Extensions) کنترل دسترسی (Access Control) سازنده ها (Initializers) مخرب ها (Deinitializers) معنای مقداری و COW (Value Semantics & COW) Equatable و Comparable (Equatable & Comparable) مدیریت خطا (Swift Error Handling) هم روندی (Swift Concurrency) حافظه (Swift Memory) مدیر بسته سوئیفت (Swift Package Manager) معرفی SwiftUI (SwiftUI Intro) راه اندازی پروژه iOS (iOS Project Setup) چیدمان SwiftUI (SwiftUI Layout) HStack VStack ZStack (HStack VStack ZStack) اسپیسر و ترازبندی (Spacers & Alignment) فریم و پدینگ (Frames & Padding) گریدها (Grids) GeometryReader (GeometryReader) ناحیه امن (Safe Area) استک های تنبل (Lazy Stacks) ناوبری SwiftUI (SwiftUI Navigation) NavigationStack (NavigationStack) NavigationLink (NavigationLink) TabView (TabView) شیت ها و پاپ اورها (Sheets & Popovers) دیپ لینک ها (Deep Links) ناوبری برنامه ای (Programmatic Nav) navigationDestination (navigationDestination) نوار ابزار و آیتم ها (Toolbar & Bar Items) جریان داده در SwiftUI (SwiftUI Data Flow) @State (@State) @Binding (@Binding) @ObservedObject & @StateObject (@ObservedObject & @StateObject) @EnvironmentObject (@EnvironmentObject) @Environment (Values) (@Environment (Values)) لیست ها و فرم ها در SwiftUI (SwiftUI Lists & Forms) List (List) ForEach (ForEach) Section (Section) Form (Form) TextField/Toggle/Picker (TextField/Toggle/Picker) Swipe Actions (Swipe Actions) Edit Mode (Edit Mode) List Styles (List Styles) انیمیشن ها در SwiftUI (SwiftUI Animations) انیمیشن های ضمنی (Implicit Animations) انیمیشن های صریح (Explicit Animations) ترنزیشن ها (Transitions) MatchedGeometryEffect (MatchedGeometryEffect) انیمیشن های فنری (Spring Animations) منحنی های انیمیشن (Animation Curves) ژست ها در SwiftUI (SwiftUI Gestures) TapGesture (TapGesture) LongPressGesture (LongPressGesture) DragGesture (DragGesture) ترکیب ژست ها (Composing Gestures) MagnificationGesture (MagnificationGesture) RotationGesture (RotationGesture) Modifierها و ViewBuilder (SwiftUI Modifiers & ViewBuilder) مودیفایرها (Modifiers) ViewBuilder (ViewBuilder) مودیفایرهای سفارشی (Custom Modifiers) پیش نمایش ها (SwiftUI Previews) گونه ها و وضعیت ها (Variants & States) حالت روشن/تیره (Light/Dark Mode) دسترس پذیری در SwiftUI (SwiftUI Accessibility) برچسب ها و عمل ها (Labels & Actions) سایز پویا (Dynamic Type) فوکوس و VoiceOver (Focus & VoiceOver) استایل دهی و تم دهی در SwiftUI (SwiftUI Styling & Theming) طرح های رنگی (Color Schemes) متریال ها (Materials) تم دهی (Theming) شبکه سازی (Networking) ماندگاری (Persistence) ماندگاری (Core Data) (Persistence (Core Data)) معماری MVVM (MVVM Architecture) AppStorage و SceneStorage (AppStorage & SceneStorage) تست SwiftUI (Testing SwiftUI) حریم خصوصی و مجوزها (Privacy & Permissions) اعلان های پوش (Push Notifications) ویجت ها و اکستنشن ها (Widgets & Extensions) کار در پس زمینه (Background Work) Core Location (Core Location) App Clips (App Clips) مبانی Keychain (Keychain Basics) CloudKit (CloudKit) سیستم فایل (File System) URLSession پس زمینه (Background URLSession) MapKit (MapKit) بومی سازی (Localization) دسترس پذیری (Accessibility) حریم خصوصی اپ (App Privacy) خرید درون برنامه ای (In-App Purchases) آنالیتیکس و گزارش گیری (Analytics & Reporting) تست با XCTest (Testing with XCTest) دارایی ها و آیکون ها (Assets & App Icons) امضا و انتشار (Signing & Distribution) TestFlight و App Store (TestFlight & App Store) انتشار اولین اپ (Ship Your First App) تمارین (Swift Exercises) کوییز (Swift Quiz)
نتیجه‌ای برای جستجو یافت نشد.
Swift

Swift — هم روندی (Swift Concurrency)

آخرین بروزرسانی: 1404/08/15

هم روندی (Swift Concurrency)

«هم روندی سویفت (Swift Concurrency)» یعنی کارهای هم زمان را امن و منظم اجرا کنیم. ابزارهای اصلی «async/await»، «Task»، «actor» و لغو همکارانه هستند. مثل مدرسه، چند کار را موازی می بری جلو، اما با نظم و صف.

مرور سریع هم روندی سویفت

با async/await کد غیرهمگام، شبیه کد معمولی می شود. با Task از محیط همگام، کار هم روند شروع کن. بازی طور فکر کن؛ چند مأموریت موازی داری اما نتیجه ها مدیریت می شود.

GCD پایه با DispatchQueue

در GCD، کارها را در صف پس زمینه اجرا می کنی. سپس با DispatchGroup منتظر اتمام می مانی. این روش قدیمی تر است، اما فهم سازوکار صف ها را ساده می کند.

import Dispatch

print("Start")
let group = DispatchGroup()
group.enter()
DispatchQueue.global().async {
  print("Background work")
  group.leave()
}
group.wait()
print("Done")

مشاهده در ادیتور

نکته: در سویفت مدرن، معمولاً async/await و Task را ترجیح بده؛ ساختارمندتر است.

async/await و Task

با async/await نوشتن ساده تر می شود. از Task برای شروع کار هم روند استفاده کن و سپس با await نتیجه را بگیر.

import Dispatch

func fetchValue() async -> Int {
  return 7
}

print("Start")
let sem = DispatchSemaphore(value: 0)
Task {
  let v = await fetchValue()
  print("Got \(v)")
  sem.signal()
}
sem.wait()
print("Done")

مشاهده در ادیتور

async let برای کارهای موازی

با async let چند کارِ فرزند را هم زمان شروع کن. سپس با await نتیجه همه را بگیر.

import Dispatch

func fetch(_ id: Int) async -> Int {
  return id * 10
}

print("Start")
let sem = DispatchSemaphore(value: 0)
Task {
  async let a = fetch(1)
  async let b = fetch(2)
  let total = await (a + b)
  print("Total \(total)")
  sem.signal()
}
sem.wait()
print("Done")

مشاهده در ادیتور

async/await همراه خطا

توابع async می توانند throw کنند. با try await فراخوانی کن و در do/catch خطا را بگیر. برای مبانی، صفحه مدیریت خطا را ببین.

import Dispatch

enum FetchError: Error {
  case bad
}

func fetch(_ ok: Bool) async throws -> Int {
  if !ok {
    throw FetchError.bad
  }
  return 42
}

print("Start")
let sem = DispatchSemaphore(value: 0)
Task {
  do {
    let v = try await fetch(false)
    print("ok \(v)")
  } catch {
    print("error")
  }
  sem.signal()
}
sem.wait()
print("Done")

مشاهده در ادیتور

گروه های تسک (Task Groups)

با withTaskGroup کارها را پخش کن و نتایج را جمع کن. مثل تیم پروژه؛ هر نفر کاری می آورد و تو مرتب می کنی.

import Dispatch

func square(_ n: Int) async -> Int {
  return n * n
}

print("Start")
let sem = DispatchSemaphore(value: 0)
Task {
  var results: [Int] = []
  await withTaskGroup(of: Int.self) { group in {
  }
  }
}

مشاهده در ادیتور

هشدار: نتایج را هنگام پیمایش گروه جمع کن و سپس مصرف کن. ترتیب تضمین نمی شود.

Actors و MainActor

«actor» از مسابقه داده جلوگیری می کند. دسترسی ها را صف می کند. برای کدهای UI از @MainActor استفاده کن تا روی نخ اصلی اجرا شود.

import Dispatch

actor SafeCounter {
  private var value = 0
  func increment() {
    value += 1
  }
  func get() -> Int {
    return value
  }
}

let counter = SafeCounter()
print("Start")
let sem = DispatchSemaphore(value: 0)
Task {
  await withTaskGroup(of: Void.self) { group in
    for _ in 0..<1000 {
      group.addTask {
        await counter.increment()
      }
    }
  }
  print("Final: \(await counter.get())")
  sem.signal()
}
sem.wait()
print("Done")

مشاهده در ادیتور

نکته: اگر State به UI مرتبط است، آن API را با @MainActor علامت بزن.

لغو تسک ها (Cancellation)

کارِ طولانی را می توان لغو کرد. با t.cancel() لغو کن و با Task.isCancelled یا Task.checkCancellation() بررسی کن.

import Dispatch

func slowWork() async throws {
  for i in 1...5 {
    try await Task.sleep(nanoseconds: 300_000_000)
    try Task.checkCancellation()
    print("Step ", i)
  }
}

let sem = DispatchSemaphore(value: 0)
let t = Task {
  do {
    try await slowWork()
  } catch {
    print("Cancelled")
  }
  sem.signal()
}

DispatchQueue.global().asyncAfter(deadline: .now() + 0.7) {
  t.cancel()
}

sem.wait()

مشاهده در ادیتور

گام های عملی

  1. نمونه ها را اجرا کن و خروجی را ببین.
  2. مقادیر را عوض کن و زمان بندی را بررسی کن.
  3. برای خطاها، به مدیریت خطا برگرد.

برای آشنایی با حافظه در کنار هم روندی، صفحه مدیریت حافظه را ببین. همچنین از لینک هم روندی سویفت به عنوان مرجع ثابت استفاده کن.

جمع بندی سریع

  • async/await کد را ساده و خوانا می کند.
  • Task کار هم روند را آغاز می کند.
  • async let کارهای موازی می سازد.
  • actor از مسابقه داده جلوگیری می کند.
  • لغو، همکاری کار و برنامه را حفظ می کند.