<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anton Paliakou</title>
    <description>The latest articles on DEV Community by Anton Paliakou (@toni777772).</description>
    <link>https://dev.to/toni777772</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F353191%2Fab31c154-a278-4321-bd10-118c40c0eee2.jpeg</url>
      <title>DEV Community: Anton Paliakou</title>
      <link>https://dev.to/toni777772</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toni777772"/>
    <language>en</language>
    <item>
      <title>Awesome macOS Libraries List</title>
      <dc:creator>Anton Paliakou</dc:creator>
      <pubDate>Fri, 21 Jan 2022 09:58:35 +0000</pubDate>
      <link>https://dev.to/toni777772/awesome-macos-libraries-list-3556</link>
      <guid>https://dev.to/toni777772/awesome-macos-libraries-list-3556</guid>
      <description>&lt;p&gt;Do you like the list? Press ⭐️ on GitHub too! Thanks!&lt;br&gt;
&lt;a href="https://github.com/Toni77777/awesome-macos-libraries" rel="noopener noreferrer"&gt;https://github.com/Toni77777/awesome-macos-libraries&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependency Manager
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/apple/swift-package-manager" rel="noopener noreferrer"&gt;Swift Package Manager&lt;/a&gt; - The Package Manager for the Swift Programming Language. Created and maintained by Apple. Language: Swift. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/CocoaPods/CocoaPods" rel="noopener noreferrer"&gt;CocoaPods&lt;/a&gt; - The Cocoa Dependency Manager. CocoaPods manages dependencies for your Xcode projects. (de facto standard/most used Dependency Manager) Language: Ruby.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Carthage/Carthage" rel="noopener noreferrer"&gt;Carthage&lt;/a&gt; - A simple, decentralized dependency manager for Cocoa. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Animation
&lt;/h2&gt;

&lt;p&gt;scroll to top&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/timdonnelly/Advance" rel="noopener noreferrer"&gt;Advance&lt;/a&gt; - Physics-based animations. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Audio
&lt;/h2&gt;

&lt;p&gt;scroll to top&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/AudioKit/AudioKit" rel="noopener noreferrer"&gt;AudioKit&lt;/a&gt; - Swift audio synthesis, processing, &amp;amp; analysis platform. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Database
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/realm/realm-swift" rel="noopener noreferrer"&gt;Realm&lt;/a&gt; - Realm is a mobile database: a replacement for Core Data &amp;amp; SQLite. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/yapstudios/YapDatabase" rel="noopener noreferrer"&gt;YapDatabase&lt;/a&gt; - YapDB is a collection/key/value store with a plugin architecture. It's built atop sqlite, for Swift &amp;amp; objective-c developers. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ccgus/fmdb" rel="noopener noreferrer"&gt;FMDB&lt;/a&gt; - A Cocoa / Objective-C wrapper around SQLite. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/modo-studio/SugarRecord" rel="noopener noreferrer"&gt;SugarRecord&lt;/a&gt; - CoreData/Realm sweet wrapper written in Swift. Language: Swift. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/stephencelis/SQLite.swift" rel="noopener noreferrer"&gt;SQLite.swift&lt;/a&gt; - A type-safe, Swift-language layer over SQLite3. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/groue/GRDB.swift" rel="noopener noreferrer"&gt;GRDB&lt;/a&gt; - A toolkit for SQLite databases, with a focus on application development. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/realm/realm-cocoa-converter" rel="noopener noreferrer"&gt;Realm Converter&lt;/a&gt; - A library that provides the ability to import/export Realm files from a variety of data container formats. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Tencent/wcdb" rel="noopener noreferrer"&gt;WCDB&lt;/a&gt; - WCDB is a cross-platform database framework developed by WeChat. Language: C. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/caiyue1993/IceCream" rel="noopener noreferrer"&gt;IceCream&lt;/a&gt; - Sync Realm Database with CloudKit. Language: Swift. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/OpenKitten/MongoKitten" rel="noopener noreferrer"&gt;MongoKitten&lt;/a&gt; - Native MongoDB driver for Swift, written in Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/arturdev/Unrealm" rel="noopener noreferrer"&gt;Unrealm&lt;/a&gt; - Unrealm is an extension on RealmCocoa, which enables Swift native types to be saved in Realm. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dependency Injection
&lt;/h2&gt;

&lt;p&gt;scroll to top&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Swinject/Swinject" rel="noopener noreferrer"&gt;Swinject&lt;/a&gt; - Dependency injection framework for Swift. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Device
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Ekhoo/Device" rel="noopener noreferrer"&gt;Device&lt;/a&gt; - Light weight tool for detecting the current device and screen size written in swift. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Extensions
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/SwifterSwift/SwifterSwift" rel="noopener noreferrer"&gt;SwifterSwift&lt;/a&gt; - A handy collection of more than 500 native Swift extensions to boost your productivity. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Files
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/nvzqz/FileKit" rel="noopener noreferrer"&gt;FileKit&lt;/a&gt; - Simple and expressive file management in Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/pixelglow/ZipZap" rel="noopener noreferrer"&gt;ZipZap&lt;/a&gt; - zip file I/O library. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/weichsel/ZIPFoundation" rel="noopener noreferrer"&gt;ZIPFoundation&lt;/a&gt; - Effortless ZIP Handling in Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ZipArchive/ZipArchive" rel="noopener noreferrer"&gt;SSZipArchive&lt;/a&gt; - ZipArchive is a simple utility class for zipping and unzipping files. Language: C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/krzysztofzablocki/KZFileWatchers" rel="noopener noreferrer"&gt;KZFileWatchers&lt;/a&gt; - A micro-framework for observing file changes, both local and remote. Helpful in building developer tools. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/amosavian/FileProvider" rel="noopener noreferrer"&gt;FilesProvider&lt;/a&gt; - FileManager replacement for Local, iCloud and Remote. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/marmelroy/Zip" rel="noopener noreferrer"&gt;Zip&lt;/a&gt; - Swift framework for zipping and unzipping files. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Image
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/onevcat/Kingfisher" rel="noopener noreferrer"&gt;Kingfisher&lt;/a&gt; - A lightweight, pure-Swift library for downloading and caching images from the web. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kean/Nuke" rel="noopener noreferrer"&gt;Nuke&lt;/a&gt; - Image loading system. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Alamofire/AlamofireImage" rel="noopener noreferrer"&gt;AlamofireImage&lt;/a&gt; - AlamofireImage is an image component library for Alamofire. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  In App Purchases and Subscription
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/bizz84/SwiftyStoreKit" rel="noopener noreferrer"&gt;SwiftyStoreKit&lt;/a&gt; - Lightweight In App Purchases Swift framework. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/RevenueCat/purchases-ios" rel="noopener noreferrer"&gt;purchases-ios&lt;/a&gt; - In-app purchases and subscriptions made easy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  JSON
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types" rel="noopener noreferrer"&gt;Codable&lt;/a&gt; - Out of box 📦  solution from Apple for Encode/Decode JSON. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SwiftyJSON/SwiftyJSON" rel="noopener noreferrer"&gt;SwiftyJSON&lt;/a&gt; - The better way to deal with JSON data in Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SBJson/SBJson" rel="noopener noreferrer"&gt;SBJson&lt;/a&gt; - This framework implements a strict JSON parser and generator in Objective-C. Language: Objective-C. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Mantle/Mantle" rel="noopener noreferrer"&gt;Mantle&lt;/a&gt; - Model framework for Cocoa and Cocoa Touch. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/jsonmodel/jsonmodel" rel="noopener noreferrer"&gt;JSONModel&lt;/a&gt; - Magical Data Modeling Framework for JSON - allows rapid creation of smart data models. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ikesyo/Himotoki" rel="noopener noreferrer"&gt;Himotoki&lt;/a&gt; - A type-safe JSON decoding library purely written in Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tristanhimmelman/AlamofireObjectMapper" rel="noopener noreferrer"&gt;AlamofireObjectMapper&lt;/a&gt; - An Alamofire extension which converts JSON response data into swift objects using ObjectMapper. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/CoderMJLee/MJExtension" rel="noopener noreferrer"&gt;MJExtension&lt;/a&gt; - A fast, convenient and nonintrusive conversion framework between JSON and model. Your model class doesn't need to extend any base class. You don't need to modify any model file. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tristanhimmelman/ObjectMapper" rel="noopener noreferrer"&gt;ObjectMapper&lt;/a&gt; - Simple JSON Object mapping written in Swift. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keychain
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/kishikawakatsumi/KeychainAccess" rel="noopener noreferrer"&gt;KeychainAccess&lt;/a&gt; - Simple Swift wrapper for Keychain. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/matthewpalmer/Locksmith" rel="noopener noreferrer"&gt;Locksmith&lt;/a&gt; - A powerful, protocol-oriented library for working with the keychain in Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/square/Valet" rel="noopener noreferrer"&gt;Valet&lt;/a&gt; - Valet lets you securely store data in the macOS Keychain without knowing a thing about how the Keychain works. It’s easy. We promise. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kishikawakatsumi/UICKeyChainStore" rel="noopener noreferrer"&gt;UICKeyChainStore&lt;/a&gt; - UICKeyChainStore is a simple wrapper for Keychain on macOS. Makes using Keychain APIs as easy as NSUserDefaults. Language: Objective-C.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Linter
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/realm/SwiftLint" rel="noopener noreferrer"&gt;SwiftLint&lt;/a&gt; - A tool to enforce Swift style and conventions. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Logging
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/CocoaLumberjack/CocoaLumberjack" rel="noopener noreferrer"&gt;CocoaLumberjack&lt;/a&gt; - A fast &amp;amp; simple, yet powerful &amp;amp; flexible logging framework. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fpillet/NSLogger" rel="noopener noreferrer"&gt;NSLogger&lt;/a&gt; - A modern, flexible logging tool. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/atereshkov/EXPLogger" rel="noopener noreferrer"&gt;EXPLogger&lt;/a&gt; - A lightweight and simple logger for Swift projects. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/DaveWoodCom/XCGLogger" rel="noopener noreferrer"&gt;XCGLogger&lt;/a&gt; - A debug log framework for use in Swift projects. Allows you to log details to the console (and optionally a file), just like you would have with NSLog() or print(), but with additional information, such as the date, function name, filename and line number. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SwiftyBeaver/SwiftyBeaver" rel="noopener noreferrer"&gt;SwiftyBeaver&lt;/a&gt; - Convenient &amp;amp; secure logging during development &amp;amp; release. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Layout
&lt;/h2&gt;

&lt;p&gt;scroll to top &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/PureLayout/PureLayout" rel="noopener noreferrer"&gt;PureLayout&lt;/a&gt; - The ultimate API for iOS &amp;amp; OS X Auto Layout — impressively simple, immensely powerful. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SnapKit/SnapKit" rel="noopener noreferrer"&gt;SnapKit&lt;/a&gt; - A Swift Autolayout DSL. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/exyte/Grid" rel="noopener noreferrer"&gt;Grid&lt;/a&gt; - The most powerful Grid container missed in SwiftUI. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kean/Align" rel="noopener noreferrer"&gt;Align&lt;/a&gt; - Intuitive and powerful Auto Layout library. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/layoutBox/PinLayout" rel="noopener noreferrer"&gt;PinLayout&lt;/a&gt; - Fast Swift Views layouting without auto layout. No magic, pure code, full control and blazing fast. Concise syntax, intuitive, readable &amp;amp; chainable. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/onmyway133/EasyAnchor" rel="noopener noreferrer"&gt;EasyAnchor&lt;/a&gt; - Declarative, extensible, powerful Auto Layout. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/roberthein/TinyConstraints" rel="noopener noreferrer"&gt;TinyConstraints&lt;/a&gt; - Nothing but sugar. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Rightpoint/Anchorage" rel="noopener noreferrer"&gt;Anchorage&lt;/a&gt; - A collection of operators and utilities that simplify layout code. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nakiostudio/EasyPeasy" rel="noopener noreferrer"&gt;EasyPeasy&lt;/a&gt; - Auto Layout made easy. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/mamaral/Neon" rel="noopener noreferrer"&gt;Neon&lt;/a&gt; - A powerful Swift programmatic UI layout framework. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/robb/Cartography" rel="noopener noreferrer"&gt;Cartography&lt;/a&gt; -  A declarative Auto Layout DSL for Swift. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Network
&lt;/h2&gt;

&lt;p&gt;scroll to top&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Alamofire/Alamofire" rel="noopener noreferrer"&gt;Alamofire&lt;/a&gt; - Alamofire is an HTTP networking library written in Swift. (de facto standard library for network) Language: Swift.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/apollographql/apollo-ios" rel="noopener noreferrer"&gt;apollo-ios&lt;/a&gt; - A strongly-typed, caching GraphQL client. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/AFNetworking/AFNetworking" rel="noopener noreferrer"&gt;AFNetworking&lt;/a&gt; - A delightful networking framework. Language: Objective-C. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ashleymills/Reachability.swift" rel="noopener noreferrer"&gt;Reachability&lt;/a&gt; - Replacement for Apple's Reachability re-written in Swift with closures. Language: Swift. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Moya/Moya" rel="noopener noreferrer"&gt;Moya&lt;/a&gt; - Network abstraction layer written in Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ishkawa/APIKit" rel="noopener noreferrer"&gt;APIKit&lt;/a&gt; - Type-safe networking abstraction layer that associates request type with response type. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/daltoniam/SwiftHTTP" rel="noopener noreferrer"&gt;SwiftHTTP&lt;/a&gt; - Thin wrapper around NSURLSession in swift. Simplifies HTTP requests. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dduan/Just" rel="noopener noreferrer"&gt;Just&lt;/a&gt; - Swift HTTP for Humans. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/bustoutsolutions/siesta" rel="noopener noreferrer"&gt;siesta&lt;/a&gt; - The civilized way to write REST API clients. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/RestKit/RestKit" rel="noopener noreferrer"&gt;RestKit&lt;/a&gt; - RestKit is a framework for consuming and modeling RESTful web resources. Language: Objective-C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/apple/swift-protobuf" rel="noopener noreferrer"&gt;Swift Protobuf&lt;/a&gt; - Plugin and runtime library for using protobuf with Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/alexeyxo/protobuf-swift" rel="noopener noreferrer"&gt;protobuf-swift&lt;/a&gt; - Google ProtocolBuffers for Apple Swift. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reactive Programming
&lt;/h2&gt;

&lt;p&gt;scroll to top&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/ReactiveX/RxSwift" rel="noopener noreferrer"&gt;RxSwift&lt;/a&gt; - Reactive Programming in Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ReactiveCocoa/ReactiveCocoa" rel="noopener noreferrer"&gt;ReactiveCocoa&lt;/a&gt; - Cocoa framework and Obj-C dynamism bindings for ReactiveSwift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ReactiveCocoa/ReactiveSwift" rel="noopener noreferrer"&gt;ReactiveSwift&lt;/a&gt; - Streams of values over time by ReactiveCocoa group. Language: Swift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Socket
&lt;/h2&gt;

&lt;p&gt;scroll to top&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/socketio/socket.io-client-swift" rel="noopener noreferrer"&gt;Socket.IO&lt;/a&gt; - Socket.IO client written on Swift. Language: Swift.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/facebookincubator/SocketRocket" rel="noopener noreferrer"&gt;SocketRocket&lt;/a&gt; - A conforming Objective-C WebSocket client library. Language: Objective-C. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/robbiehanson/CocoaAsyncSocket" rel="noopener noreferrer"&gt;CocoaAsyncSocket&lt;/a&gt; - Asynchronous socket networking library. Language: Objective-C. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do you know a cool macOS library? Welcome to contribute!&lt;br&gt;
&lt;a href="https://github.com/Toni77777/awesome-macos-libraries" rel="noopener noreferrer"&gt;https://github.com/Toni77777/awesome-macos-libraries&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>macos</category>
      <category>github</category>
      <category>osx</category>
    </item>
    <item>
      <title>How to play a video with VideoPlayer in SwiftUI</title>
      <dc:creator>Anton Paliakou</dc:creator>
      <pubDate>Mon, 04 Oct 2021 19:27:22 +0000</pubDate>
      <link>https://dev.to/toni777772/how-to-play-a-video-with-videoplayer-in-swiftui-o0c</link>
      <guid>https://dev.to/toni777772/how-to-play-a-video-with-videoplayer-in-swiftui-o0c</guid>
      <description>&lt;p&gt;&lt;strong&gt;VideoPlayer&lt;/strong&gt; - is a view that displays content from a player and a native user interface to control playback.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Available iOS 14.0+, macOS 11.0+, Mac Catalyst 14.0+, tvOS 14.0+, watchOS 7.0+, Xcode 12.0+.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How to use the VideoPlayer view?  Go to the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;AVKit&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;SwiftUI&lt;/span&gt;

&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// 2&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;videoUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;fileURLWithPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;forResource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"PexelsSea"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ofType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"mp4"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;VideoPlayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;player&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;AVPlayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;videoUrl&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// 3&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;The first step is to import the &lt;code&gt;AVKit&lt;/code&gt; framework.&lt;/li&gt;
&lt;li&gt;The second step is create video &lt;code&gt;URL&lt;/code&gt;. The &lt;code&gt;URL&lt;/code&gt; can be created for local video or remote. In our code case, a URL was created for local video from the bundle. &lt;/li&gt;
&lt;li&gt;Final step is to pass  &lt;code&gt;AVPlayer&lt;/code&gt;, as the first parameter to  &lt;code&gt;VideoPlayer&lt;/code&gt; view. &lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;VideoPlayer&lt;/code&gt; view has playback controls.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzw9mb7s0wqgnlhsh7xr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzw9mb7s0wqgnlhsh7xr.png" alt="VideoPlayer" width="800" height="1562"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F811ndh9kxnqx4r5jwew4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F811ndh9kxnqx4r5jwew4.png" alt="VideoPlayerLandscape" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Video Overlay (Watermark)
&lt;/h3&gt;

&lt;p&gt;A  &lt;code&gt;VideoPlayer&lt;/code&gt; has another  &lt;code&gt;init&lt;/code&gt; function with two parameters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;player&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;AVPlayer&lt;/span&gt;&lt;span class="p"&gt;?,&lt;/span&gt;
     &lt;span class="kd"&gt;@ViewBuilder&lt;/span&gt; &lt;span class="nv"&gt;videoOverlay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;VideoOverlay&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;First parameter is &lt;code&gt;AVPlayer&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Second parameter is  &lt;code&gt;videoOverlay&lt;/code&gt; closure. The closure returns a  &lt;code&gt;VideoOverlay&lt;/code&gt; view to present over the player’s video content. The important thing is this overlay view is fully interactive, but is placed below the system-provided playback controls, and only receives unhandled events. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's go to the code.  As an example, will add a simple text in the lower right corner.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;AVKit&lt;/span&gt; 
&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;SwiftUI&lt;/span&gt;

&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;videoUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;fileURLWithPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Bundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;forResource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"PexelsSea"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ofType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"mp4"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="kt"&gt;VideoPlayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;player&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;AVPlayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;videoOverlay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="kt"&gt;VStack&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                 &lt;span class="kt"&gt;Spacer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                 &lt;span class="kt"&gt;HStack&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                     &lt;span class="kt"&gt;Spacer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                     &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Code sample by ToniDevBlog"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;foregroundColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;white&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                 &lt;span class="p"&gt;}&lt;/span&gt;
             &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
         &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Firl0sdfo46v4aav5qjc9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Firl0sdfo46v4aav5qjc9.png" alt="VideoOverlay" width="800" height="1562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Toni77777/VideoPlayerSample" rel="noopener noreferrer"&gt;Full source code available on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Article originally published at &lt;a href="https://tonidevblog.com/posts/how-to-play-video-with-videoplayer-in-swiftui/" rel="noopener noreferrer"&gt;ToniDevBlog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading! See you soon. 👋&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swiftui</category>
      <category>swift</category>
      <category>avkit</category>
    </item>
    <item>
      <title>What's new in PreviewDevice 0.8.0</title>
      <dc:creator>Anton Paliakou</dc:creator>
      <pubDate>Sat, 18 Sep 2021 15:32:12 +0000</pubDate>
      <link>https://dev.to/toni777772/what-s-new-in-previewdevice-0-8-0-5dc0</link>
      <guid>https://dev.to/toni777772/what-s-new-in-previewdevice-0-8-0-5dc0</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/Toni77777/PreviewDevice" rel="noopener noreferrer"&gt;PreviewDevice&lt;/a&gt; is a library with type-safe syntax sugar for preview device on SwiftUI. &lt;br&gt;
If you don't know what is the library, I recomment read this &lt;a href="https://tonidevblog.com/posts/meet-previewdevice/" rel="noopener noreferrer"&gt;article&lt;/a&gt;. &lt;/p&gt;
&lt;h2&gt;
  
  
  What's new in 0.8.0? Go-go-go
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Added support new Apple devices:
&lt;/h3&gt;

&lt;p&gt;iPhones: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iPhone 13 mini (&lt;code&gt;Device.iphone13Mini&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;iPhone 13 (&lt;code&gt;Device.iphone13&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;iPhone 13 Pro (&lt;code&gt;Device.iphone13Pro&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;iPhone 13 Pro Max (&lt;code&gt;Device.iphone13ProMax&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apple Watch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apple Watch Series 7 - 41mm (&lt;code&gt;Device.watchSeries7_41mm&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Apple Watch Series 7 - 45mm (&lt;code&gt;Device.watchSeries7_45mm&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;iPads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iPad 9th generation (&lt;code&gt;Device.ipad_9Gen&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;iPad mini 6th generation (&lt;code&gt;Device.ipadMini6&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Preview on device with orientation and color schemes.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Available iOS 15+ OSX 12+,  macCatalyst 15+, tvOS 15+, watchOS 8.0+&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView_Previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;PreviewProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iphone13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="nv"&gt;orientation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;portrait&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="nv"&gt;colorSchemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;light&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do you like the library? Click the star on &lt;a href="https://github.com/Toni77777/PreviewDevice" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks for reading! See you soon. 👋&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>swiftui</category>
      <category>preview</category>
    </item>
    <item>
      <title>How to generate a random unique identifier with UUID</title>
      <dc:creator>Anton Paliakou</dc:creator>
      <pubDate>Fri, 17 Sep 2021 08:15:42 +0000</pubDate>
      <link>https://dev.to/toni777772/how-to-generate-a-random-unique-identifier-with-uuid-cbo</link>
      <guid>https://dev.to/toni777772/how-to-generate-a-random-unique-identifier-with-uuid-cbo</guid>
      <description>&lt;p&gt;UUID is a universally unique identifier. UUID can be used to identify types, interfaces, and other items.&lt;br&gt;
Creating an object or some entity with an unique identifier is a common task for developers. UUID structure created for to do this and to do it best, do not need create "bicycle".&lt;br&gt;
&lt;strong&gt;UUID is guaranteed to be unique&lt;/strong&gt;. When initializing the structure, a new UUID is created with RFC 4122 version 4 random bytes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;Foundation&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;identifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uuidString&lt;/span&gt;
&lt;span class="kt"&gt;Swift&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Result: "6A967474-8672-4ABC-A57B-52EA809C5E6D" &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Available iOS 6.0+, macOS 10.8+, tvOS 9.0+, watchOS 2.0+.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What's UUID from a code perspective?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://developer.apple.com/documentation/foundation/uuid" rel="noopener noreferrer"&gt;UUID&lt;/a&gt; is a simple structure and is a part of Foundation framework.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ReferenceConvertible&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Hashable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Equatable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;CustomStringConvertible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;/// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UUID conforms 4 protocols: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/foundation/referenceconvertible" rel="noopener noreferrer"&gt;ReferenceConvertible&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/swift/hashable" rel="noopener noreferrer"&gt;Hashable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/swift/equatable" rel="noopener noreferrer"&gt;Equatable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.toCustomStringConvertible"&gt;CustomStringConvertible&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, the structure has some properties:&lt;/p&gt;

&lt;p&gt;1 &lt;code&gt;uuid&lt;/code&gt; - Returns the UUID as bytes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 &lt;code&gt;uuidString&lt;/code&gt; - Returns a string created from the UUID, such as “E621E1F8-C36C-495A-93FC-0C247A3E6E5F”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;uuidString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Articles comes to devto portal with delay 1-2 week, if you want read my articles without delay you can visit &lt;a href="https://tonidevblog.com/" rel="noopener noreferrer"&gt;ToniDevBlog&lt;/a&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Article originally published at &lt;a href="https://tonidevblog.com/posts/how-to-generate-a-random-unique-identifier-with-uuid/" rel="noopener noreferrer"&gt;ToniDevBlog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks for reading! See you soon. 👋&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>uuid</category>
      <category>apple</category>
    </item>
    <item>
      <title>Meet PreviewDevice 0.7.0</title>
      <dc:creator>Anton Paliakou</dc:creator>
      <pubDate>Fri, 27 Aug 2021 16:56:35 +0000</pubDate>
      <link>https://dev.to/toni777772/meet-previewdevice-0-7-0-1dpg</link>
      <guid>https://dev.to/toni777772/meet-previewdevice-0-7-0-1dpg</guid>
      <description>&lt;p&gt;&lt;strong&gt;PreviewDevice&lt;/strong&gt; - a library with elegant syntax for preview device in SwiftUI.&lt;/p&gt;

&lt;p&gt;The first question that comes to mind is,&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do I need to use the third-party library for SwiftUI preview ?
&lt;/h3&gt;

&lt;p&gt;For an answer, this question will compare Apple API for preview with PreviewDevice library. Let's look at real cases on projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case:
&lt;/h3&gt;

&lt;p&gt;Preview on device. Let's say you want to see a preview in the iPhone SE 2 Generation (4.7 inch screen size) with preview device name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple way&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView_Previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;PreviewProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone SE (2nd generation)"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone SE (2nd generation)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PreviewDevice lib&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView_Previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;PreviewProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iphoneSE_2Gen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is easy make mistakes in iphone device name when use standard Apple way. Also, you need to know and keep in your mind the correct iPhone name. PreviewDevice library provides a type-safe way for preview devices. The library has &lt;code&gt;Device&lt;/code&gt; enum with all devices types: all iphones, all ipads, all apple watches, ipod, mac.&lt;/p&gt;

&lt;p&gt;Result: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdxobakjgnu0bqv437fj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdxobakjgnu0bqv437fj.png" alt="Result" width="726" height="1390"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Case:
&lt;/h3&gt;

&lt;p&gt;Make preview on some devices. As example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iPhone 8&lt;/li&gt;
&lt;li&gt;iPhone 8 Plus&lt;/li&gt;
&lt;li&gt;iPhone12 Pro&lt;/li&gt;
&lt;li&gt;iPhone 12&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Apple way&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView_Previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;PreviewProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;Group&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone 8"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone 8"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone 8 Plus"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone 8 Plus"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone 12 Pro"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone 12 Pro"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PreviewDevice lib&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView_Previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;PreviewProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iphone8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iphone8Plus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iphone12Pro&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iphone12&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The library awesome managed this case! Single line solution 💪&lt;/p&gt;

&lt;p&gt;Result:&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciz0rd74ur57c4u6u33m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciz0rd74ur57c4u6u33m.png" alt="Result2" width="622" height="1502"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Case:
&lt;/h3&gt;

&lt;p&gt;Make preview on the device for light and night mode. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple way&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView_Previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;PreviewProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;Group&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preferredColorScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;light&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preferredColorScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PreviewDevice lib&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView_Previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;PreviewProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iphone12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;colorSchemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;light&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Single line solution from the library 💪 💪&lt;/p&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fix0z0fobp0mlroebza8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fix0z0fobp0mlroebza8j.png" alt="Result3" width="566" height="1156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Case:
&lt;/h3&gt;

&lt;p&gt;Make preview on the device with different interface orientations (portrait, landscape left, landscape right). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple way&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;@available&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iOS&lt;/span&gt; &lt;span class="mf"&gt;15.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView_Previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;PreviewProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;Group&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewInterfaceOrientation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;portrait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewInterfaceOrientation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;landscapeLeft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;PreviewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDisplayName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"iPhone 12"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewInterfaceOrientation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;landscapeRight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PreviewDevice lib&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;@available&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iOS&lt;/span&gt; &lt;span class="mf"&gt;15.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView_Previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;PreviewProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;previews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;previewDevice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iphone12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;orientations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;portrait&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;landscapeLeft&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;landscapeRight&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8688y8hn0v2gppioqlr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8688y8hn0v2gppioqlr.png" alt="Result4" width="616" height="1436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One line code 💪 💪 💪&lt;/p&gt;
&lt;h2&gt;
  
  
  Installation library
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Requearements&lt;/em&gt; &lt;em&gt;Xcode13&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://guides.cocoapods.org/using/using-cocoapods.html" rel="noopener noreferrer"&gt;CocoaPods&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Specify next line in Podfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;pod&lt;/span&gt; &lt;span class="no"&gt;PreviewDevice&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;a href="https://github.com/apple/swift-package-manager" rel="noopener noreferrer"&gt;Swift Package Manager&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Open Xcode, File -&amp;gt; Swift Packages -&amp;gt; Add Packages.. and paste library git url:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/Toni77777/PreviewDevice.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;PreviewDevice&lt;/strong&gt; is a type-safe syntax sugar for preview device on SwiftUI.&lt;/p&gt;

&lt;p&gt;Do you have a cool idea for a preview? Welcome to &lt;a href="https://github.com/Toni77777/PreviewDevice" rel="noopener noreferrer"&gt;contribute&lt;/a&gt;!&lt;br&gt;
Thanks for reading! See you soon. 👋&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>swiftui</category>
      <category>xcode</category>
    </item>
    <item>
      <title>Awesome SwiftUI Libraries List</title>
      <dc:creator>Anton Paliakou</dc:creator>
      <pubDate>Wed, 18 Aug 2021 22:50:00 +0000</pubDate>
      <link>https://dev.to/toni777772/awesome-swiftui-libraries-list-3agc</link>
      <guid>https://dev.to/toni777772/awesome-swiftui-libraries-list-3agc</guid>
      <description>&lt;p&gt;Do you like the list? Press ⭐️ on GitHub too! Thanks! &lt;br&gt;
&lt;a href="https://github.com/Toni77777/awesome-swiftui-libraries" rel="noopener noreferrer"&gt;https://github.com/Toni77777/awesome-swiftui-libraries&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Alert
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/elai950/AlertToast" rel="noopener noreferrer"&gt;AlertToast&lt;/a&gt; - Create Apple-like alerts &amp;amp; toasts using SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/neel-makhecha/AlertX" rel="noopener noreferrer"&gt;AlertX&lt;/a&gt; - A library for SwiftUI to create custom alerts with different appearances and animations.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ivanvorobei/SPAlert" rel="noopener noreferrer"&gt;SPAlert&lt;/a&gt; - Native alert from Apple Music &amp;amp; Feedback. Contains Done, Heart &amp;amp; Message and other presets. Support SwiftUI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Animation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/amosgyamfi/swiftui-animation-library" rel="noopener noreferrer"&gt;swiftui-animations&lt;/a&gt; - SwiftUI Animation Library. Useful SwiftUI animations including Loading/progress, Looping, On-off, Enter, Exit, Fade, Spin and Background animations that you can directly implement in your next iOS application or project. The library also contains huge examples of spring animations such as Inertial Bounce, Shake, Twirl, Jelly, Jiggle, Rubber Band…&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Arvindcs/SwiftUI-Animation" rel="noopener noreferrer"&gt;SwiftUI-Animation&lt;/a&gt; - SwiftUI Animation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/maustinstar/liquid" rel="noopener noreferrer"&gt;Liquid&lt;/a&gt; - Create a playful backsplash in SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/maustinstar/shiny" rel="noopener noreferrer"&gt;shiny&lt;/a&gt; - Shiny uses your gyroscope to simulate lighting and motion effects on colors. Works on almost every SwiftUI View&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/adellibovi/SwiftUI-PathAnimations/blob/master/Package.swift" rel="noopener noreferrer"&gt;SwiftUIPathAnimations&lt;/a&gt; - Tools for SwiftUI that helps perform Path and Shape animations, such us morphing circle or shape transformations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Audio
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/twostraws/Subsonic" rel="noopener noreferrer"&gt;Subsonic&lt;/a&gt; - A small library that makes it easier to play audio with SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bezier-Path
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/kieranb662/SwiftUI-bez" rel="noopener noreferrer"&gt;SwiftUI-bez&lt;/a&gt; - Utilities for working with bezier curves in SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Blur
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Co2333/Colorful" rel="noopener noreferrer"&gt;Colorful&lt;/a&gt; - A SwiftUI implementation of AppleCard's animated colorful blur background&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/lucasbrown/swiftui-visual-effects" rel="noopener noreferrer"&gt;SwiftUIVisualEffects&lt;/a&gt; - View modifiers that wrap UIVisualEffectView, with environment integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Button
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/atrinh0/buttoncraft" rel="noopener noreferrer"&gt;buttoncraft&lt;/a&gt; - Craft that perfect SwiftUI button effect&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/robhasacamera/CUIExpandableButton" rel="noopener noreferrer"&gt;CUIExpandableButton&lt;/a&gt; - A SwiftUI button that expands to show more content&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/exyte/FloatingButton" rel="noopener noreferrer"&gt;FloatingButton&lt;/a&gt; - Easily customizable floating button menu created with SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/changemin/LoadingButton" rel="noopener noreferrer"&gt;LoadingButton&lt;/a&gt; - Loading Animation Button for SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Calendar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/GGJJack/SwiftUICalendar" rel="noopener noreferrer"&gt;SwiftUICalendar&lt;/a&gt; - SwiftUI base simple Calendar&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/RaffiKian/RKCalendar" rel="noopener noreferrer"&gt;RKCalendar&lt;/a&gt; - SwiftUI Simple Calendar / Date Picker for iOS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ThasianX/ElegantCalendar" rel="noopener noreferrer"&gt;ElegantCalendar&lt;/a&gt; - The elegant full screen calendar missed in SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/yodagamaheshan/DateGrid" rel="noopener noreferrer"&gt;DateGrid&lt;/a&gt; - A customizable swiftui calendar&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/EvanCooper9/swift-week-view" rel="noopener noreferrer"&gt;ECWeekView&lt;/a&gt; - An iOS calendar library for displaying calendar events in a week view&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Camera
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rorodriguez116/Camera-SwiftUI" rel="noopener noreferrer"&gt;Camera-SwiftUI&lt;/a&gt; - A lightweight camera library for quick integration with SwiftUI - iOS/iPadOS only&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/brettfazio/CameraView" rel="noopener noreferrer"&gt;CameraView&lt;/a&gt; - SwiftUI View for live camera output&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/pierreveron/SwiftUICam" rel="noopener noreferrer"&gt;SwiftUICam&lt;/a&gt; - A Snapchat Style Camera View to use with a SwiftUI interface&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Card
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/danielsaidi/DeckKit" rel="noopener noreferrer"&gt;DeckKit&lt;/a&gt; - DeckKit is a tiny library that helps you create card-based apps in SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/joogps/SlideOverCard" rel="noopener noreferrer"&gt;SlideOverCard&lt;/a&gt; - A SwiftUI card view, made great for setup interactions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dadalar/SwiftUI-CardStackView" rel="noopener noreferrer"&gt;SwiftUI-CardStackView&lt;/a&gt; - A easy-to-use SwiftUI view for Tinder like cards on iOS, macOS &amp;amp; watchOS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/terminatorover/RGStack" rel="noopener noreferrer"&gt;RGStack&lt;/a&gt; - This UI attempts to capture the Quibi Card Stack and the associated User Interaction&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Volorf/swipeable-cards" rel="noopener noreferrer"&gt;swipeable-cards&lt;/a&gt; - Swipeable Cards with SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chart
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/mecid/SwiftUICharts" rel="noopener noreferrer"&gt;SwiftUICharts&lt;/a&gt; - A simple line and bar charting library that supports accessibility written using SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/spacenation/swiftui-charts" rel="noopener noreferrer"&gt;swiftui-charts&lt;/a&gt; - SwiftUI Charts with custom styles&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/lludo/SwiftSunburstDiagram" rel="noopener noreferrer"&gt;SwiftSunburstDiagram&lt;/a&gt; - SwiftUI library to easily render diagrams given a tree of objects. Similar to ring chart, sunburst chart, multilevel pie chart.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simonboots/SwiftUIFourierSeries" rel="noopener noreferrer"&gt;SwiftUIFourierSeries&lt;/a&gt; - A Fourier Series visualisation written in Swift/SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/chenhaiteng/Rings" rel="noopener noreferrer"&gt;Rings&lt;/a&gt; - Rings provides some UI with the Ring, Circle or other similar shapes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/aunnnn/RHLinePlot" rel="noopener noreferrer"&gt;RHLinePlot&lt;/a&gt; - Line plot like in Robinhood app in SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/romanbaitaliuk/BarChart" rel="noopener noreferrer"&gt;BarChart&lt;/a&gt; - SwiftUI Bar Chart&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/denniscm190/stock-charts" rel="noopener noreferrer"&gt;stock-charts&lt;/a&gt; - SwiftUI stock charts for iOS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/pichukov/LightChart" rel="noopener noreferrer"&gt;LightChart&lt;/a&gt; - SwiftUI charts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dagronf/DSFSparkline" rel="noopener noreferrer"&gt;DSFSparkline&lt;/a&gt; - A lightweight sparkline component for macOS, iOS and tvOS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/AppPear/ChartView" rel="noopener noreferrer"&gt;ChartView&lt;/a&gt; - ChartView made in SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Carousel
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/JWAutumn/ACarousel" rel="noopener noreferrer"&gt;ACarousel&lt;/a&gt; - A carousel view for SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Clock
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/renaudjenny/SwiftClockUI" rel="noopener noreferrer"&gt;SwiftClockUI&lt;/a&gt; - SwiftUI library to display a clock. You can move the arms to change the time, change the style of the clock and customise some configurations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Collection
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/apptekstudios/ASCollectionView" rel="noopener noreferrer"&gt;ASCollectionView&lt;/a&gt; - A SwiftUI collection view with support for custom layouts, preloading, and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Color
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/hendriku/ColorPicker" rel="noopener noreferrer"&gt;ColorPickerRing&lt;/a&gt; - Simple color picker. Looks like a wheel. Plain SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/yannickl/DynamicColor" rel="noopener noreferrer"&gt;DynamicColor&lt;/a&gt; - Yet another extension to manipulate colors easily in Swift and SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Priva28/SwiftUIColourWheel" rel="noopener noreferrer"&gt;SwiftUIColourWheel&lt;/a&gt; - A colour wheel made all in SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Confetti
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/ziligy/ConfettiView" rel="noopener noreferrer"&gt;ConfettiView&lt;/a&gt; - a Confetti View for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/simibac/ConfettiSwiftUI" rel="noopener noreferrer"&gt;ConfettiSwiftUI&lt;/a&gt; - SwiftUI Package for Configurable Confetti Animation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ivanvorobei/SPConfetti" rel="noopener noreferrer"&gt;SPConfetti&lt;/a&gt; - Show the confetti only when the user is having fun, and if not having fun, don't show it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CoreData
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/ftchirou/PredicateKit" rel="noopener noreferrer"&gt;PredicateKit&lt;/a&gt; - PredicateKit allows Swift developers to write expressive and type-safe predicates for CoreData using key-paths, comparisons and logical operators, literal values, and functions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/vmanot/SwiftDB" rel="noopener noreferrer"&gt;SwiftDB&lt;/a&gt; - A modern database abstraction layer, batteries included.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Debug
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/duraidabdul/LocalConsole" rel="noopener noreferrer"&gt;LocalConsole&lt;/a&gt; - In-app console and debug tools for iOS developers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nalexn/EnvironmentOverrides" rel="noopener noreferrer"&gt;EnvironmentOverrides&lt;/a&gt; - QA assistant for a SwiftUI app: change the color scheme, accessibility settings, and localization on the fly!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Extensions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/SwiftUIX/SwiftUIX" rel="noopener noreferrer"&gt;SwiftUIX&lt;/a&gt; - An extension to the standard SwiftUI library.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tokijh/ViewCondition" rel="noopener noreferrer"&gt;ViewCondition&lt;/a&gt; - Super sweet syntactic sugar for SwiftUI.View initializers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Game
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/InvadingOctopus/octopuskit" rel="noopener noreferrer"&gt;OctopusKit&lt;/a&gt; - 2D ECS game engine in 100% Swift + SwiftUI for iOS, macOS, tvOS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gradient
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/joogps/IrregularGradient" rel="noopener noreferrer"&gt;IrregularGradient&lt;/a&gt; - Create animated irregular gradients in SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Grid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/boraseoksoon/BSZoomGridScrollView" rel="noopener noreferrer"&gt;BSZoomGridScrollView&lt;/a&gt; - Fun GridScrollView written in SwiftUI + Combine, bridging between UIKit&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/johnsusek/FlowStack" rel="noopener noreferrer"&gt;FlowStack&lt;/a&gt; - A grid layout view for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/paololeonardi/WaterfallGrid" rel="noopener noreferrer"&gt;WaterfallGrid&lt;/a&gt; - A waterfall grid layout view for SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Q-Mobile/QGrid" rel="noopener noreferrer"&gt;QGrid&lt;/a&gt; - 🎛 QGrid: The missing SwiftUI collection view.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/pietropizzi/GridStack" rel="noopener noreferrer"&gt;GridStack&lt;/a&gt; - A flexible grid layout view for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/onmyway133/Micro" rel="noopener noreferrer"&gt;Micro&lt;/a&gt; - Fast diffing and type safe SwiftUI style data source for UICollectionView&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Image
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/krzyzanowskim/SwiftUI.AnimatedImage" rel="noopener noreferrer"&gt;AnimatedImage&lt;/a&gt; - SwiftUI AnimatedImage View&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SDWebImage/SDWebImageSwiftUI" rel="noopener noreferrer"&gt;SDWebImageSwiftUI&lt;/a&gt; - SwiftUI Image loading and Animation framework powered by SDWebImage&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dmytro-anokhin/url-image" rel="noopener noreferrer"&gt;url-image&lt;/a&gt; - AsyncImage before iOS 15. Lightweight, pure SwiftUI Image view, that displays an image downloaded from URL, with auxiliary views and local cache.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/KittenYang/Longinus" rel="noopener noreferrer"&gt;Longinus&lt;/a&gt; - A pure Swift high-performance asynchronous image loading framework.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kean/NukeUI" rel="noopener noreferrer"&gt;NukeUI&lt;/a&gt; - Lazy image loading for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/cmtrounce/SwURL" rel="noopener noreferrer"&gt;SwURL&lt;/a&gt; - Lightweight asynchronous image loading in SwiftUI. Fetch and display images from URLs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/lorenzofiamingo/SwiftUI-CachedAsyncImage" rel="noopener noreferrer"&gt;CachedAsyncImage&lt;/a&gt; - 🗃️ The simplest way to add cache to your AsyncImage.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Jake-Short/swiftui-image-viewer" rel="noopener noreferrer"&gt;swiftui-image-viewer&lt;/a&gt; - Image viewer built in SwiftUI for both local and remote images &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  List
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/crelies/AdvancedList" rel="noopener noreferrer"&gt;AdvancedList&lt;/a&gt; - Advanced List View for SwiftUI with pagination &amp;amp; different states&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Toni77777/EmptyList" rel="noopener noreferrer"&gt;EmptyList&lt;/a&gt; - EmptyList - List(SwiftUI) supports displaying Empty ListView for empty state&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/EnesKaraosman/SwipeCell" rel="noopener noreferrer"&gt;SwipeCell&lt;/a&gt; - Swipe Left2Right &amp;amp; Right2Left, pure SwiftUI implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Loading-Indicator
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/exyte/ActivityIndicatorView" rel="noopener noreferrer"&gt;ActivityIndicatorView&lt;/a&gt; - A number of preset loading indicators created with SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/honkmaster/TTProgressHUD" rel="noopener noreferrer"&gt;TTProgressHUD&lt;/a&gt; - TTProgressHUD is a light weight HUD written in SwiftUI meant to display the progress of an ongoing task on iOS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ninjaprox/LoaderUI" rel="noopener noreferrer"&gt;LoaderUI&lt;/a&gt; - NVActivityIndicatorView implemented in SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/JonasGessner/JGProgressHUD-SwiftUI" rel="noopener noreferrer"&gt;JGProgressHUD-SwiftUI&lt;/a&gt; - Easily show HUDs with SwiftUI! Lightweight SwiftUI wrapper for JGProgressHUD for iOS, tvOS, Catalyst&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/MojtabaHs/iActivityIndicator" rel="noopener noreferrer"&gt;iActivityIndicator&lt;/a&gt; - A Native SwiftUI Activity Indicator Pack&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Markdown
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/dasautoooo/Parma" rel="noopener noreferrer"&gt;Parma&lt;/a&gt; - A SwiftUI view for displaying Markdown with customizable appearances.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/gonzalezreal/MarkdownUI" rel="noopener noreferrer"&gt;MarkdownUI&lt;/a&gt; - Render Markdown text in SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Lambdo-Labs/MDText" rel="noopener noreferrer"&gt;MDText&lt;/a&gt; - s a markdown render library built in and for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/qeude/SwiftDown" rel="noopener noreferrer"&gt;SwiftDown&lt;/a&gt; - A themable markdown editor component for your SwiftUI apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Menu
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/akardas16/SideMenu" rel="noopener noreferrer"&gt;SideMenu&lt;/a&gt; - This repository shows Side Menu written with SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Navigation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/SwiftUIX/Coordinator" rel="noopener noreferrer"&gt;Coordinator&lt;/a&gt; - A declarative navigation API for SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/johnpatrickmorgan/FlowStacks" rel="noopener noreferrer"&gt;FlowStacks&lt;/a&gt; - FlowStacks allows you to hoist SwiftUI navigation and presentation state into a Coordinator&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/frzi/SwiftUIRouter" rel="noopener noreferrer"&gt;SwiftUIRouter&lt;/a&gt; - Path based routing in SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Bahn-X/swift-composable-navigator" rel="noopener noreferrer"&gt;Swift Composable Navigator&lt;/a&gt; - An open source library for building deep-linkable SwiftUI applications with composition, testing and ergonomics in mind&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rundfunk47/stinsen" rel="noopener noreferrer"&gt;stinsen&lt;/a&gt; - Coordinators in SwiftUI. Simple, powerful and elegant.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/matteopuc/swiftui-navigation-stack" rel="noopener noreferrer"&gt;NavigationStack&lt;/a&gt; - An alternative SwiftUI NavigationView implementing classic stack-based navigation giving also some more control on animations and programmatic navigation.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rebeloper/NavigationKit" rel="noopener noreferrer"&gt;NavigationKit&lt;/a&gt; - SwiftUI navigation done right&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/1amageek/Router" rel="noopener noreferrer"&gt;Router&lt;/a&gt; - Router is a library that assists with SwiftUI view transitions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/valentinradu/Helm" rel="noopener noreferrer"&gt;Helm&lt;/a&gt; - A graph-based SwiftUI router &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/fermoya/SwiftUIPager" rel="noopener noreferrer"&gt;SwiftUIPager&lt;/a&gt; - Native Pager in SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/exyte/ConcentricOnboarding" rel="noopener noreferrer"&gt;ConcentricOnboarding&lt;/a&gt; - SwiftUI library for a walkthrough or onboarding flow with tap actions&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nachonavarro/Pages" rel="noopener noreferrer"&gt;Pages&lt;/a&gt; - A lightweight, paging view solution for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fredyshox/PageView" rel="noopener noreferrer"&gt;fredyshox/PageView&lt;/a&gt; - SwiftUI view enabling navigation between pages of content, imitating the behaviour of UIPageViewController for iOS and watchOS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/xmartlabs/PagerTabStripView" rel="noopener noreferrer"&gt;PagerTabStripView&lt;/a&gt; - Elegant Pager View fully written in pure SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Payment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/alexejn/TypeYouCard" rel="noopener noreferrer"&gt;TypeYouCard&lt;/a&gt; - SwiftUI Paycard form&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Permission
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/jevonmao/PermissionsSwiftUI" rel="noopener noreferrer"&gt;PermissionsSwiftUI&lt;/a&gt; - A SwiftUI package to beautifully display and handle permissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Photo-Picker
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/moifort/swiftUI-photo-library-picker" rel="noopener noreferrer"&gt;PhotoLibraryPicker&lt;/a&gt; - Photo Library Picker for SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Picker
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/GGJJack/SwiftUIWheelPicker" rel="noopener noreferrer"&gt;SwiftUIWheelPicker&lt;/a&gt; - Custom horizontal wheel picker for SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preview
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Toni77777/PreviewDevice" rel="noopener noreferrer"&gt;PreviewDevice&lt;/a&gt; - PreviewDevice - library with elegant syntax for Preview Device in SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/theoriginalbit/PreviewView" rel="noopener noreferrer"&gt;PreviewView&lt;/a&gt; - Make use of SwiftUI Previews for UIKit&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/posix88/SafePreviewDevice" rel="noopener noreferrer"&gt;SafePreviewDevice&lt;/a&gt; - Safe and fast access to SwiftUI PreviewDevice.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/eDeniska/figma-preview-swiftui" rel="noopener noreferrer"&gt;FigmaPreviewSwiftUI&lt;/a&gt; - Figma component preview for your SwiftUI views&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/eDeniska/figma-preview-swiftui" rel="noopener noreferrer"&gt;ZeplinPreviewSwiftUI&lt;/a&gt; - Zeplin component preview for your SwiftUI views&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/finestructure/Gala" rel="noopener noreferrer"&gt;Gala&lt;/a&gt; - Create SwiftUI preview variants for macOS, iOS, tvOS, and watchOS with ease&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  QRCode
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/heart/CarBode-Barcode-Scanner-For-SwiftUI" rel="noopener noreferrer"&gt;CarBode&lt;/a&gt; - CarBode : Free &amp;amp; Opensource barcode scanner &amp;amp; generator for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/eDeniska/zeplin-preview-swiftui" rel="noopener noreferrer"&gt;CodeScanner&lt;/a&gt; - A SwiftUI view that is able to scan barcodes, QR codes, and more, and send back what was found.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Search
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/thislooksfun/SwiftlySearch" rel="noopener noreferrer"&gt;SwiftlySearch&lt;/a&gt; - A small, lightweight UISearchController wrapper for SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Settings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rryam/RRSettingsKit" rel="noopener noreferrer"&gt;RRSettingsKit&lt;/a&gt; - A beautiful customizable settings screen created in SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  State
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/fmo91/Pigeon" rel="noopener noreferrer"&gt;Pigeon&lt;/a&gt; - Async state management for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/VergeGroup/Verge" rel="noopener noreferrer"&gt;Verge&lt;/a&gt; - Verge is a very tunable state-management engine on iOS App&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/StevenLambion/SwiftDux" rel="noopener noreferrer"&gt;SwiftDux&lt;/a&gt; - Predictable state management for SwiftUI applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scroll
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/nerdsupremacist/FancyScrollView" rel="noopener noreferrer"&gt;FancyScrollView&lt;/a&gt; - A SwiftUI ScrollView Designed to imitate the App Store and Apple Music ScrollViews (with or without a Parallax Header)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/maxnatchanon/trackable-scroll-view" rel="noopener noreferrer"&gt;SwiftUITrackableScrollView&lt;/a&gt; - A SwiftUI custom scroll view with content offset binding&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Shapes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/spacenation/swiftui-shapes" rel="noopener noreferrer"&gt;SwiftUI Shapes&lt;/a&gt; - Collection of SwiftUI shapes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/phimage/morphi" rel="noopener noreferrer"&gt;morphi&lt;/a&gt; - Shapes for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kieranb662/SwiftUI-Shapes" rel="noopener noreferrer"&gt;SwiftUI-Shapes&lt;/a&gt; - Commonly Used Shapes and Utilities In SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sheet
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/weitieda/bottom-sheet" rel="noopener noreferrer"&gt;BottomSheet&lt;/a&gt; - A SwiftUI view component sliding in from bottom&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/maustinstar/swiftui-drawer" rel="noopener noreferrer"&gt;SwiftUI Drawer&lt;/a&gt; - A SwiftUI bottom-up &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nerdsupremacist/Snap" rel="noopener noreferrer"&gt;Snap&lt;/a&gt; - A customizable Snapping Drawer à la Apple Maps. 100% in SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/LucasMucGH/BottomSheet" rel="noopener noreferrer"&gt;BottomSheet (LucasMucGH)&lt;/a&gt; - A sliding Sheet from the bottom of the Screen with 3 States build with SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/AndreaMiotto/ActionOver" rel="noopener noreferrer"&gt;ActionOver&lt;/a&gt; - A custom SwiftUI modifier to present an ActionSheet or a Popover menu&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/egeniq/BetterSheet" rel="noopener noreferrer"&gt;BetterSheet&lt;/a&gt; - A powerful SwiftUI sheet replacement&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/badrinathvm/StepperView" rel="noopener noreferrer"&gt;StepperView&lt;/a&gt; - SwiftUI iOS component for Step Indications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Skeleton
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/CSolanaM/SkeletonUI" rel="noopener noreferrer"&gt;SkeletonUI&lt;/a&gt; - Elegant skeleton loading animation in SwiftUI and Combine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Slider
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/spacenation/swiftui-sliders" rel="noopener noreferrer"&gt;Swiftui sliders&lt;/a&gt; - SwiftUI Sliders with custom styles&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Pyroh/SlidingRuler" rel="noopener noreferrer"&gt;SlidingRuler&lt;/a&gt; - A sliding ruler control for SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kieranb662/Sliders-SwiftUI" rel="noopener noreferrer"&gt;Sliders SwiftUI&lt;/a&gt; - Collection of unique fully customizable SwiftUI sliders, joysticks, trackpads and more&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Speech
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Cay-Zhang/SwiftSpeech" rel="noopener noreferrer"&gt;SwiftSpeech&lt;/a&gt; - A speech recognition framework designed for SwiftUI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SVG
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/exyte/SVGView" rel="noopener noreferrer"&gt;SVGView&lt;/a&gt; - SVG parser and renderer written in SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TabBar-and-Tabs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/SimformSolutionsPvtLtd/SSCustomTabbar" rel="noopener noreferrer"&gt;SSCustomTabbar&lt;/a&gt; - Simple Animated tabbar with native control&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/10011co/FloatingTabBar" rel="noopener noreferrer"&gt;FloatingTabBar&lt;/a&gt; - Aesthetic floating tab bar&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/NicholasBellucci/StatefulTabView" rel="noopener noreferrer"&gt;StatefulTabView&lt;/a&gt; - A SwiftUI TabView that retains the state of each tab as well as some other goodies.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/QuynhNguyen/SlidingTabView" rel="noopener noreferrer"&gt;SlidingTabView&lt;/a&gt; - SwiftUI - Sliding Tab View&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TextField
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/marinofelipe/CurrencyText" rel="noopener noreferrer"&gt;CurrencyText&lt;/a&gt; - Currency text field formatter&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kishanraja/FloatingLabelTextFieldSwiftUI" rel="noopener noreferrer"&gt;FloatingLabelTextFieldSwiftUI&lt;/a&gt; - Floating Label TextField for SwiftUI. FloatingLabelTextFieldSwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/MojtabaHs/iPhoneNumberField" rel="noopener noreferrer"&gt;iPhoneNumberField&lt;/a&gt; - Elegant SwiftUI phone number textField&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kitlangton/OmenTextField" rel="noopener noreferrer"&gt;OmenTextField&lt;/a&gt; - A better TextField for SwiftUI. A growing, multiline, auto-focusable TextField supporting bindable focus&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/art-technologies/swift-focuser" rel="noopener noreferrer"&gt;Focuser&lt;/a&gt; - Focus text field in SwiftUI dynamically and progress through form using iOS keyboard&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/michaelhenry/KeyboardAvoider" rel="noopener noreferrer"&gt;KeyboardAvoider&lt;/a&gt; - The missing interactive keyboard in SwiftUI for iOS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TextView
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/kenmueller/TextView" rel="noopener noreferrer"&gt;TextView&lt;/a&gt; - The missing TextView in SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Text
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/davdroman/TextBuilder" rel="noopener noreferrer"&gt;TextBuilder&lt;/a&gt; - Like a SwiftUI ViewBuilder, but for Text&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/joekndy/MarqueeText" rel="noopener noreferrer"&gt;MarqueeText&lt;/a&gt; - Marquee or "scrolling text" effect in SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Toast-and-Popup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/omaralbeik/Drops" rel="noopener noreferrer"&gt;Drops&lt;/a&gt; - A µFramework for showing alerts like the one used when copying from pasteboard or connecting Apple pencil&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/exyte/PopupView" rel="noopener noreferrer"&gt;ExytePopupView&lt;/a&gt; - Toasts and popups library written with SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/quanshousio/ToastUI" rel="noopener noreferrer"&gt;ToastUI&lt;/a&gt; - A simple way to show toast in SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SimformSolutionsPvtLtd/SSToastMessage" rel="noopener noreferrer"&gt;SSToastMessage&lt;/a&gt; - SSToastMessage is written purely in SwiftUI. It will add toast, alert, and floating message view over the top of any view. It is intended to be simple, lightweight, and easy to use. It will be a popup with a single line of code.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sanzaru/SimpleToast" rel="noopener noreferrer"&gt;SimpleToast&lt;/a&gt; - SimpleToast is a simple, lightweight and easy to use library to show toasts / pop-ups inside your iOS application in SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/quassum/SwiftUI-Tooltip" rel="noopener noreferrer"&gt;SwiftUI-Tooltip&lt;/a&gt; - Easy Tooltip for your SwiftUI Project&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Unit-testing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/nalexn/ViewInspector" rel="noopener noreferrer"&gt;ViewInspector&lt;/a&gt; - Runtime introspection and unit testing of SwiftUI views&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Video
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/wxxsw/VideoPlayer" rel="noopener noreferrer"&gt;VideoPlayer&lt;/a&gt; - A video player for SwiftUI, support for caching, preload and custom control view&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SvenTiigi/YouTubePlayerKit" rel="noopener noreferrer"&gt;YouTubePlayerKit&lt;/a&gt; - A Swift Package to easily play YouTube videos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Whats-New
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/SvenTiigi/WhatsNewKit" rel="noopener noreferrer"&gt;WhatsNewKit&lt;/a&gt; - Showcase your awesome new app features&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Web
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/stleamist/BetterSafariView" rel="noopener noreferrer"&gt;BetterSafariView&lt;/a&gt; - A better way to present a SFSafariViewController or start a ASWebAuthenticationSession in SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TokamakUI/Tokamak" rel="noopener noreferrer"&gt;Tokamak&lt;/a&gt; - SwiftUI-compatible framework for building browser apps with WebAssembly and native apps for other platforms.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/carson-katri/SwiftWebUI" rel="noopener noreferrer"&gt;SwiftWebUI&lt;/a&gt; - SwiftUI with support for WebAssembly &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do you know a cool SwiftUI library? Welcome to contribute!&lt;br&gt;
&lt;a href="https://github.com/Toni77777/awesome-swiftui-libraries" rel="noopener noreferrer"&gt;https://github.com/Toni77777/awesome-swiftui-libraries&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>swiftui</category>
      <category>github</category>
    </item>
    <item>
      <title>Task is new ViewModifier in iOS15. SwiftUI</title>
      <dc:creator>Anton Paliakou</dc:creator>
      <pubDate>Fri, 13 Aug 2021 21:24:00 +0000</pubDate>
      <link>https://dev.to/toni777772/task-new-viewmodifier-in-ios15-swiftui-16ke</link>
      <guid>https://dev.to/toni777772/task-new-viewmodifier-in-ios15-swiftui-16ke</guid>
      <description>&lt;p&gt;Apple added a new ViewModifier &lt;a href="https://developer.apple.com/documentation/swiftui/circle/task(priority:_:)" rel="noopener noreferrer"&gt;&lt;em&gt;task(priority:_:)&lt;/em&gt;&lt;/a&gt; in iOS 15. This modifier can be added to any SwiftUI &lt;a href="https://developer.apple.com/documentation/swiftui/view" rel="noopener noreferrer"&gt;View&lt;/a&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://developer.apple.com/documentation/swiftui/circle/task(priority:_:)" rel="noopener noreferrer"&gt;&lt;em&gt;task(priority:_:)&lt;/em&gt;&lt;/a&gt; avalible since iOS15+ macOS 12.0+ Mac Catalyst 15.0+ watchOS 8.0+ tvOS 15.0+&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From official apple documentation:&lt;/p&gt;

&lt;p&gt;Adds an asynchronous task to perform when this view appears.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;TaskPriority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userInitiated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;@escaping&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A view that runs the specified action asynchronously when the view appears.&lt;/p&gt;

&lt;p&gt;See details about parameters:&lt;/p&gt;

&lt;p&gt;1 &lt;strong&gt;&lt;em&gt;Priority&lt;/em&gt;&lt;/strong&gt; The task priority to use when creating the asynchronous task. The default priority is &lt;a href="https://developer.apple.com/documentation/swift/taskpriority/3851283-userinitiated" rel="noopener noreferrer"&gt;userInitiated&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All priorities list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/swift/taskpriority/3851283-userinitiated" rel="noopener noreferrer"&gt;userInitiated&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/swift/taskpriority/3851275-high" rel="noopener noreferrer"&gt;high&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/swift/taskpriority/3862710-medium" rel="noopener noreferrer"&gt;medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/swift/taskpriority/3851279-low" rel="noopener noreferrer"&gt;low&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/swift/taskpriority/3851285-utility" rel="noopener noreferrer"&gt;utility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/swift/taskpriority/3851272-background" rel="noopener noreferrer"&gt;background&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2 &lt;strong&gt;&lt;em&gt;Action&lt;/em&gt;&lt;/strong&gt; A closure that SwiftUI calls as an asynchronous task when the view appears. SwiftUI automatically cancels the task if the view disappears before the action completes.&lt;/p&gt;

&lt;p&gt;This modifier is a good point to start and to do some asynchronous job related to the view. You don't have to worry about canceling asynchronous task, SwiftUI handles it out of the box.&lt;br&gt;&lt;br&gt;
SwiftUI cancels the task in case of the task doesn’t finish before SwiftUI removes the view or the view changes identity.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;

&lt;p&gt;Show the list users of GitHub. Displays the login and avatar image for each user.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;List&lt;/code&gt; code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;@State&lt;/span&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;User&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
        &lt;span class="kt"&gt;HStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;AsyncImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avatarUrl&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;avatar&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
                &lt;span class="n"&gt;avatar&lt;/span&gt;
                    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resizable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aspectRatio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;contentMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cornerRadius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nv"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;ProgressView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;leading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;trailing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;loadUsers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are interested in function &lt;code&gt;loadUsers()&lt;/code&gt;. The loading of users starts when the &lt;code&gt;List&lt;/code&gt; appears. &lt;br&gt;
First of all the function gets JSON of users from GitHub. After that, it decodes the JSON into objects and finally sets the result to the &lt;code&gt;List&lt;/code&gt;'s data source.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;loadUsers()&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;loadUsers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;User&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"https://api.github.com/users"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="kt"&gt;URLSession&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="kt"&gt;JSONDecoder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="kt"&gt;User&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;Swift&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwkgjl1j6wq0txgba04x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwkgjl1j6wq0txgba04x.png" alt="UsersList" width="800" height="1564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;User&lt;/code&gt;model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Codable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Identifiable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;login&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;avatarUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;

    &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="kt"&gt;CodingKeys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;CodingKey&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;login&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;avatarUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"avatar_url"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model implements &lt;code&gt;Codable&lt;/code&gt; protocol for decoding JSON. Enum  &lt;code&gt;CodingKeys&lt;/code&gt; is used to translate from the snake case 🐍 to the camel case 🐫. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Toni77777/GithubUsersSample" rel="noopener noreferrer"&gt;Full source code&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Thanks for reading! See you soon. &lt;/p&gt;

</description>
      <category>ios</category>
      <category>swiftui</category>
      <category>ios15</category>
      <category>task</category>
    </item>
    <item>
      <title>Empty List placeholder. SwiftUI</title>
      <dc:creator>Anton Paliakou</dc:creator>
      <pubDate>Thu, 08 Jul 2021 14:15:32 +0000</pubDate>
      <link>https://dev.to/toni777772/empty-list-placeholder-swiftui-4b7e</link>
      <guid>https://dev.to/toni777772/empty-list-placeholder-swiftui-4b7e</guid>
      <description>&lt;p&gt;Year twenty twenty-one. Almost a month has passed since the WWDC. As usual Apple presented many amazing features/updates 😍. As expected updated SwiftUI framework. But did not add placeholder for &lt;a href="https://developer.apple.com/documentation/swiftui/list" rel="noopener noreferrer"&gt;&lt;code&gt;List&lt;/code&gt;&lt;/a&gt; view 😭. It's not big deal, but it was one of my expectations from conference. Okay let's do it ourselves 💪&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://developer.apple.com/documentation/swiftui/list" rel="noopener noreferrer"&gt;&lt;code&gt;List&lt;/code&gt;&lt;/a&gt; is one of the most used view in apps.&lt;br&gt;
When using the &lt;a href="https://developer.apple.com/documentation/swiftui/list" rel="noopener noreferrer"&gt;&lt;code&gt;List&lt;/code&gt;&lt;/a&gt;, devs also must handle the state of an empty data range and show a placeholder. &lt;/p&gt;

&lt;p&gt;As an example, consider a simple list of countries. Show placeholder when data is empty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3s18nmf1lbowhm38q9z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3s18nmf1lbowhm38q9z.png" alt="Countries" width="800" height="1556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr21n4v592v6rb7yl7gza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr21n4v592v6rb7yl7gza.png" alt="Placeholder" width="800" height="1556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Country model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;Country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Identifiable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, have any ideas on how to implement a placeholder? &lt;/p&gt;

&lt;h3&gt;
  
  
  First idea &lt;code&gt;If else&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The first thing that comes to mind it's &lt;a href="https://docs.swift.org/swift-book/ReferenceManual/Statements.html" rel="noopener noreferrer"&gt;&lt;code&gt;if else&lt;/code&gt;&lt;/a&gt; conditional statement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;@State&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Country&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="c1"&gt;// Data source&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isEmpty&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No Countries"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Placeholder&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;largeTitle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="c1"&gt;// List countires&lt;/span&gt;
                &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Advantages: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the most simple and clear way&lt;/li&gt;
&lt;li&gt;easy to modify &lt;/li&gt;
&lt;li&gt;it works and shows the placeholder when needed&lt;/li&gt;
&lt;li&gt;easy to use any view for placeholder &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disadvantages: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the code looks cumbersome&lt;/li&gt;
&lt;li&gt;not reusable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works and sometimes it's enough. But in production, it would be nice to have a component that implements the logic of displaying a placeholder inside the component. So, goes to the next idea. &lt;/p&gt;

&lt;h3&gt;
  
  
  Second idea &lt;code&gt;EmptyList&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Improve &lt;code&gt;if else&lt;/code&gt; idea and move logic show/hide placeholder to custom view, call it &lt;code&gt;EmptyList&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;EmptyList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;RandomAccessCollection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;ListRowView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;PlaceholderView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="kt"&gt;Items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Identifiable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Items&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;listRowView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;ListRowView&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;placeholderView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;PlaceholderView&lt;/span&gt;

    &lt;span class="c1"&gt;/// - Parameters:&lt;/span&gt;
    &lt;span class="c1"&gt;///   - items: Source data for List. Item must implement Identifiable protocol&lt;/span&gt;
    &lt;span class="c1"&gt;///   - listRowView: View displayed for each source Item&lt;/span&gt;
    &lt;span class="c1"&gt;///   - placeholderView: Placeholder. View displayed when the items collection isEmpty&lt;/span&gt;
    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="kd"&gt;@ViewBuilder&lt;/span&gt; &lt;span class="nv"&gt;listRowView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;@escaping&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;ListRowView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="kd"&gt;@ViewBuilder&lt;/span&gt; &lt;span class="nv"&gt;placeholderView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;@escaping&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;PlaceholderView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listRowView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;listRowView&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;placeholderView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;placeholderView&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isEmpty&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;List&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// List countires&lt;/span&gt;
                &lt;span class="kt"&gt;ForEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
                    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listRowView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;placeholderView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the &lt;code&gt;EmptyList&lt;/code&gt; is very easy. First parameter - data source, second parameter -  list row view, and finally third parameter - placeholder view.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;@State&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Country&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="c1"&gt;// Data source&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;EmptyList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Data items &lt;/span&gt;
        &lt;span class="nv"&gt;listRowView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="c1"&gt;// List row view&lt;/span&gt;
            &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nv"&gt;placeholderView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No Countries"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Placeholder&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;largeTitle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Advantages: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code looks clean and clear 😍&lt;/li&gt;
&lt;li&gt;easy to modify custom view&lt;/li&gt;
&lt;li&gt;reusable in project&lt;/li&gt;
&lt;li&gt;use any view for placeholder &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disadvantages: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list is embedded in &lt;code&gt;EmptyList&lt;/code&gt; view, and if want to add some ViewModifier-s to the list, need for more efforts and modify code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usually, I would have to say that this is all and say goodbye but is not all 😎. I want to share an idea of how I cook placeholder for lists in my projects. &lt;/p&gt;

&lt;h3&gt;
  
  
  Preferred idea &lt;code&gt;ViewModifier&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Create custom &lt;a href="https://developer.apple.com/documentation/swiftui/viewmodifier" rel="noopener noreferrer"&gt;&lt;code&gt;ViewModifier&lt;/code&gt;&lt;/a&gt; to manage placeholder, call it &lt;code&gt;EmptyDataModifier&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;EmptyDataModifier&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Placeholder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ViewModifier&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Placeholder&lt;/span&gt;

    &lt;span class="kd"&gt;@ViewBuilder&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isEmpty&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;placeholder&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uses  &lt;code&gt;EmptyDataModifier&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;
&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;@State&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Country&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="c1"&gt;// Data source&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
            &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;modifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;EmptyDataModifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No Countries"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// Placeholder&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Also via extension can little bit improve the solution and limited apply &lt;code&gt;EmptyDataModifier&lt;/code&gt; only for &lt;code&gt;List&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;extension&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;emptyListPlaceholder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;AnyView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;modifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;EmptyDataModifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;ContentView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;@State&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Country&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="c1"&gt;// Data source&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;some&lt;/span&gt; &lt;span class="kt"&gt;View&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
            &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emptyListPlaceholder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="kt"&gt;AnyView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ListPlaceholderView&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;// Placeholder &lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Advantages: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code look clean and clear 😍 😍 😍&lt;/li&gt;
&lt;li&gt;no need to create a custom &lt;code&gt;List&lt;/code&gt; view&lt;/li&gt;
&lt;li&gt;easy to modify&lt;/li&gt;
&lt;li&gt;reusable in project&lt;/li&gt;
&lt;li&gt;use any view for placeholder &lt;/li&gt;
&lt;li&gt;this way for can be used for any view placeholder &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disadvantages: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no  (subjective opinion)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instead of summary
&lt;/h3&gt;

&lt;p&gt;In my opinion, the most suitable way to implement a placeholder is to use a custom &lt;a href="https://developer.apple.com/documentation/swiftui/viewmodifier" rel="noopener noreferrer"&gt;&lt;code&gt;ViewModifier&lt;/code&gt;&lt;/a&gt;. &lt;br&gt;
I'm sure sooner or later the Apple will add a placeholder for the List view. Maybe this article will be as a request for this feature for Apple. Who knows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Toni77777/ListPlaceholderSample" rel="noopener noreferrer"&gt;Source code&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Thanks for reading! See you soon. &lt;/p&gt;

</description>
      <category>swift</category>
      <category>swiftui</category>
      <category>ios</category>
      <category>placeholder</category>
    </item>
    <item>
      <title>Create a iOS app without Storyboard, since Xcode 11.0 (iOS 13+)</title>
      <dc:creator>Anton Paliakou</dc:creator>
      <pubDate>Wed, 17 Jun 2020 10:52:52 +0000</pubDate>
      <link>https://dev.to/toni777772/create-a-ios-app-without-storyboard-since-xcode-11-0-ios-13-2ep9</link>
      <guid>https://dev.to/toni777772/create-a-ios-app-without-storyboard-since-xcode-11-0-ios-13-2ep9</guid>
      <description>&lt;p&gt;Well, sometimes developers have a great opportunity to create projects from scratch. And after creating a project, developers are divided into 2 groups: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who preferer keep &lt;code&gt;storyboard&lt;/code&gt; as an entry point to the application.&lt;/li&gt;
&lt;li&gt;Who preferer set &lt;a href="https://developer.apple.com/documentation/uikit/uiwindow/1621581-rootviewcontroller" rel="noopener noreferrer"&gt;&lt;code&gt;rootViewController&lt;/code&gt;&lt;/a&gt; for &lt;a href="https://developer.apple.com/documentation/uikit/uiwindow" rel="noopener noreferrer"&gt;&lt;code&gt;window&lt;/code&gt;&lt;/a&gt; via code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Consider in more detail way set &lt;a href="https://developer.apple.com/documentation/uikit/uiwindow/1621581-rootviewcontroller" rel="noopener noreferrer"&gt;&lt;code&gt;rootViewController&lt;/code&gt;&lt;/a&gt; via code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before iOS 13 and Xcode 11
&lt;/h3&gt;

&lt;p&gt;Before iOS 13 and Xcode 11 code for set &lt;a href="https://developer.apple.com/documentation/uikit/uiwindow/1621581-rootviewcontroller" rel="noopener noreferrer"&gt;&lt;code&gt;rootViewController&lt;/code&gt;&lt;/a&gt; we inserted in &lt;em&gt;function&lt;/em&gt; &lt;a href="https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623032-application" rel="noopener noreferrer"&gt;&lt;code&gt;application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&amp;gt; Bool&lt;/code&gt;&lt;/a&gt; in  &lt;code&gt;AppDelegate&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;Example setup &lt;a href="https://github.com/ToniSamples/AppWithoutStoryboard/blob/master/AppWithoutStoryboard/LoginViewController.swift" rel="noopener noreferrer"&gt;&lt;code&gt;LoginViewController&lt;/code&gt;&lt;/a&gt; as root in &lt;code&gt;AppDelegate&lt;/code&gt;. &lt;a href="https://github.com/ToniSamples/AppWithoutStoryboard/blob/master/AppWithoutStoryboard/LoginViewController.swift" rel="noopener noreferrer"&gt;&lt;code&gt;LoginViewController&lt;/code&gt;&lt;/a&gt; is simple child of &lt;a href="https://developer.apple.com/documentation/uikit/uiviewcontroller" rel="noopener noreferrer"&gt;&lt;code&gt;UIViewController&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&amp;gt; Bool {
        // Create a new window property 
        self.window = UIWindow(frame: UIScreen.main.bounds)

        // Set custom LoginViewController as root
        self.window?.rootViewController = LoginViewController()

        // Present the window
        self.window?.makeKeyAndVisible()
        return true
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;After creating new *Single View App&lt;/em&gt; project since Xcode 11, this way does not work.&lt;/strong&gt;*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Since iOS 13 and Xcode 11
&lt;/h3&gt;

&lt;p&gt;So, way for set  &lt;a href="https://developer.apple.com/documentation/uikit/uiwindow/1621581-rootviewcontroller" rel="noopener noreferrer"&gt;&lt;code&gt;rootViewController&lt;/code&gt;&lt;/a&gt; via code after Xcode 11 and iOS 13 changed. &lt;br&gt;
There are some fundamental changes to the application lifecycle with iPadOS and iOS 13. Windows are managed by a &lt;a href="https://developer.apple.com/documentation/uikit/uiscenesession" rel="noopener noreferrer"&gt;&lt;code&gt;UISceneSession&lt;/code&gt;&lt;/a&gt; now. New projects have new &lt;em&gt;Swift&lt;/em&gt; file &lt;a href="https://developer.apple.com/documentation/uikit/uiscenedelegate" rel="noopener noreferrer"&gt;&lt;code&gt;SceneDelegate&lt;/code&gt;&lt;/a&gt;. &lt;br&gt;
Also see sample app &lt;a href="https://developer.apple.com/documentation/uikit/uiscenedelegate/supporting_multiple_windows_on_ipad" rel="noopener noreferrer"&gt;supporting multiple windows on iPad&lt;/a&gt;.&lt;br&gt;
But this article answer another question:  &lt;em&gt;Where to setup rootViewController?&lt;/em&gt;&lt;br&gt;
&lt;a href="https://developer.apple.com/documentation/uikit/uiscenedelegate" rel="noopener noreferrer"&gt;&lt;code&gt;SceneDelegate&lt;/code&gt;&lt;/a&gt; has &lt;em&gt;function&lt;/em&gt; &lt;a href="https://developer.apple.com/documentation/uikit/uiscenedelegate/3197914-scene" rel="noopener noreferrer"&gt;&lt;code&gt;scene(_ scene: UIScene, &lt;br&gt;
willConnectTo session: UISceneSession, &lt;br&gt;
options connectionOptions: UIScene.ConnectionOptions)&lt;/code&gt;&lt;/a&gt;. The &lt;em&gt;function&lt;/em&gt; tells the delegate about the addition of a scene to the app. This is the right place to setup!&lt;/p&gt;

&lt;p&gt;Example setup &lt;a href="https://github.com/ToniSamples/AppWithoutStoryboard/blob/master/AppWithoutStoryboard/LoginViewController.swift" rel="noopener noreferrer"&gt;&lt;code&gt;LoginViewController&lt;/code&gt;&lt;/a&gt; as root in &lt;code&gt;SceneDelegate&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene,
               willConnectTo session: UISceneSession,
               options connectionOptions: UIScene.ConnectionOptions) {
        // Get UIWindowScene
        guard let windowScene = (scene as? UIWindowScene) else {
            return
        }

        // Create a new window property 
        self.window = UIWindow(frame: windowScene.coordinateSpace.bounds)

        // Set windowScene for window
        self.window?.windowScene = windowScene 

        // Set custom LoginViewController as root
        window?.rootViewController = LoginViewController()

        // Present the window
        window?.makeKeyAndVisible()
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/ToniSamples/AppWithoutStoryboard" rel="noopener noreferrer"&gt;Source code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading! See you soon. &lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
    </item>
  </channel>
</rss>
