فهرست سرفصل‌های 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 — ویجت ها و اکستنشن ها (Widgets & Extensions)

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

ویجت ها و اکستنشن ها (Widgets & Extensions)

ویجت (Widget) کارت کوچک اطلاعات است. سریع دیده می شود. اکستنشن (Extension) بخش اضافه برنامه است. کار خاصی انجام می دهد. با گروه های برنامه داده کوچک را مشترک کن. سپس با WidgetKit نمایش بده. مثل تابلو اعلانات مدرسه که خلاصه ها را نشان می دهد.

Widget timeline

یک تایم لاین بساز. سپس در زمان های مختلف مقدار نشان بده. از TimelineProvider استفاده کن.

import WidgetKit
import SwiftUI

struct TimeEntry: TimelineEntry {
  let date: Date
}

struct TimeProvider: TimelineProvider {
  func placeholder(in context: Context) -> TimeEntry {
    return TimeEntry(date: Date())
  }
  func getSnapshot(in context: Context, completion: @escaping (TimeEntry) -> Void) {
    completion(TimeEntry(date: Date()))
  }
  func getTimeline(in context: Context, completion: @escaping (Timeline<TimeEntry>) -> Void) {
    let entries: [TimeEntry] = stride(from: 0, through: 60 * 30, by: 60).map { offset in
      let d: Date = Date().addingTimeInterval(Double(offset))
      return TimeEntry(date: d)
    }
    completion(Timeline(entries: entries, policy: .atEnd))
  }
}

struct TimeWidgetView: View {
  var entry: TimeEntry
  var body: some View {
    Text(entry.date, style: .time)
      .font(.headline)
  }
}

@main
struct TimeWidget: Widget {
  var body: some WidgetConfiguration {
    StaticConfiguration(kind: "TimeWidget", provider: TimeProvider()) { e in
      TimeWidgetView(entry: e)
    }
  }
}

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

import SwiftUI

struct ContentView: View {
  var body: some View {
    Text("Widget timeline demo")
  }
}

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

import SwiftUI

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup {
      ContentView()
    }
  }
}

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

Share extension skeleton

اسکلت یک Share Extension را بساز. سپس متن ورودی را مدیریت کن. در پایان پست کن.

import SwiftUI

struct ShareExtensionSkeleton: View {
  @State private var sharedText: String = ""
  var body: some View {
    VStack(spacing: 12) {
      Text("Incoming content")
      TextEditor(text: $sharedText)
        .frame(minHeight: 120)
        .border(.secondary)
      HStack {
        Spacer()
        Button("Post") {
          // handle share
        }
      }
    }
    .padding()
  }
}

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

import SwiftUI

struct ContentView: View {
  var body: some View {
    ShareExtensionSkeleton()
  }
}

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

import SwiftUI

struct MyApp: App {
  var body: some Scene {
    WindowGroup {
      ContentView()
    }
  }
}

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

App Groups (اشتراک داده با ویجت)

قابلیت App Groups را برای هر دو تارگت فعال کن. سپس با UserDefaults مقدار کوچک را رد و بدل کن.

import Foundation

func updateSharedNotesCount(_ count: Int) {
  let defaults: UserDefaults? = UserDefaults(suiteName: "group.com.example.notes")
  defaults?.set(count, forKey: "notesCount")
}

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

import WidgetKit
import SwiftUI

struct CountEntry: TimelineEntry {
  let date: Date
  let count: Int
}

struct NotesProvider: TimelineProvider {
  func placeholder(in context: Context) -> CountEntry {
    return CountEntry(date: Date(), count: 0)
  }
  func getSnapshot(in context: Context, completion: @escaping (CountEntry) -> Void) {
    let defaults: UserDefaults? = UserDefaults(suiteName: "group.com.example.notes")
    let count: Int = defaults?.integer(forKey: "notesCount") ?? 0
    completion(CountEntry(date: Date(), count: count))
  }
  func getTimeline(in context: Context, completion: @escaping (Timeline<CountEntry>) -> Void) {
    let defaults: UserDefaults? = UserDefaults(suiteName: "group.com.example.notes")
    let count: Int = defaults?.integer(forKey: "notesCount") ?? 0
    let entries: [CountEntry] = [CountEntry(date: Date(), count: count)]
    let timeline: Timeline<CountEntry> = Timeline(entries: entries, policy: .after(Date().addingTimeInterval(1800)))
    completion(timeline)
  }
}

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

Widgets

تارگت ویجت بساز. سپس Provider و View را پیاده سازی کن. پیکربندی استاتیک برگردان.

import WidgetKit
import SwiftUI

struct Provider: TimelineProvider {
  func placeholder(in context: Context) -> SimpleEntry {
    return SimpleEntry(date: Date())
  }
  func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> Void) {
    completion(SimpleEntry(date: Date()))
  }
  func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) {
    let timeline: Timeline<SimpleEntry> = Timeline(entries: [SimpleEntry(date: Date())], policy: .atEnd)
    completion(timeline)
  }
}

struct SimpleEntry: TimelineEntry {
  let date: Date
}

struct MyWidgetEntryView: View {
  var entry: SimpleEntry
  var body: some View {
    Text(entry.date, style: .time)
  }
}

@main
struct MyWidget: Widget {
  var body: some WidgetConfiguration {
    StaticConfiguration(kind: "MyWidget", provider: Provider()) { entry in
      MyWidgetEntryView(entry: entry)
    }
  }
}

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

Deep Links from Widgets

با URL روی ویجت تپ می شود. سپس برنامه به صفحه هدف می رود.

import SwiftUI

struct NotesCountView: View {
  var entry: CountEntry
  var body: some View {
    Link(destination: URL(string: "myapp://notes")!) {
      Text("Notes: \(entry.count)")
    }
  }
}

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

import SwiftUI

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup {
      ContentView()
        .onOpenURL { url in
          // Route based on url
        }
    }
  }
}

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

Refresh & Timeline Policy

راهکار تازه سازی را انتخاب کن. سپس در زمان مناسب رفرش کن.

import WidgetKit

// Update at a future date
completion(Timeline(entries: entries, policy: .after(Date().addingTimeInterval(1800))))

// Or end when entries are exhausted
// completion(Timeline(entries: entries, policy: .atEnd))

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

import WidgetKit

// Refresh a specific widget kind after writing new data to App Group
WidgetCenter.shared.reloadTimelines(ofKind: "NotesCount")

// Or refresh all widget kinds
// WidgetCenter.shared.reloadAllTimelines()

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

Supported Families

خانواده های پشتیبانی شده را اعلام کن. سپس اندازه ها را تست کن.

import WidgetKit

@main
struct NotesCountWidget: Widget {
  var body: some WidgetConfiguration {
    StaticConfiguration(kind: "NotesCount", provider: NotesProvider()) { entry in
      NotesCountView(entry: entry)
    }
    .supportedFamilies([.systemSmall, .systemMedium])
  }
}

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

Testing Widgets

پیش نمایش ویجت را ببین. سپس روی دستگاه اضافه کن. تغییر App Group را بده و رفرش کن.

جمع بندی سریع

  • App Groups را فعال کن.
  • Provider، Entry و View بساز.
  • تایم لاین و Policy را تنظیم کن.
  • دیپ لینک را برای ناوبری بده.
  • اندازه ها را روی دستگاه تست کن.