├── deprecated
├── Server
│ └── server
│ │ ├── Sources
│ │ ├── App
│ │ │ ├── Controllers
│ │ │ │ └── .gitkeep
│ │ │ ├── Models
│ │ │ │ └── User.swift
│ │ │ ├── configure.swift
│ │ │ └── routes.swift
│ │ └── Run
│ │ │ └── main.swift
│ │ ├── .dockerignore
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ └── settings.json
│ │ ├── Tests
│ │ └── AppTests
│ │ │ └── AppTests.swift
│ │ └── docker-compose.yml
└── Playground
│ └── MyPlayground.playground
│ └── contents.xcplayground
├── Chapter 09 - Networking with Combine
├── server
│ ├── Sources
│ │ ├── App
│ │ │ ├── Controllers
│ │ │ │ └── .gitkeep
│ │ │ ├── Models
│ │ │ │ └── User.swift
│ │ │ ├── configure.swift
│ │ │ └── routes.swift
│ │ └── Run
│ │ │ └── main.swift
│ ├── .dockerignore
│ ├── .gitignore
│ ├── Tests
│ │ └── AppTests
│ │ │ └── AppTests.swift
│ └── docker-compose.yml
├── final
│ └── SignUpForm
│ │ ├── SignUpForm
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── SignUpFormApp.swift
│ │ └── SignUpForm.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
└── starter
│ └── SignUpForm
│ ├── SignUpForm
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ └── SignUpFormApp.swift
│ └── SignUpForm.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ ├── IDEWorkspaceChecks.plist
│ └── swiftpm
│ └── Package.resolved
├── Chapter 10 - Error Handling in Combine
├── server
│ ├── Sources
│ │ ├── App
│ │ │ ├── Controllers
│ │ │ │ └── .gitkeep
│ │ │ ├── Models
│ │ │ │ └── User.swift
│ │ │ └── configure.swift
│ │ └── Run
│ │ │ └── main.swift
│ ├── .dockerignore
│ ├── .gitignore
│ ├── Tests
│ │ └── AppTests
│ │ │ └── AppTests.swift
│ └── docker-compose.yml
├── final
│ └── SignUpForm
│ │ ├── SignUpForm
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── SignUpFormApp.swift
│ │ └── SignUpForm.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
└── starter
│ └── SignUpForm
│ ├── SignUpForm
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ └── SignUpFormApp.swift
│ └── SignUpForm.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ ├── IDEWorkspaceChecks.plist
│ └── swiftpm
│ └── Package.resolved
├── Chapter 11 - Implementing Custom Combine Operators
├── server
│ ├── Sources
│ │ ├── App
│ │ │ ├── Controllers
│ │ │ │ └── .gitkeep
│ │ │ ├── Models
│ │ │ │ └── User.swift
│ │ │ └── configure.swift
│ │ └── Run
│ │ │ └── main.swift
│ ├── .dockerignore
│ ├── .gitignore
│ ├── Tests
│ │ └── AppTests
│ │ │ └── AppTests.swift
│ └── docker-compose.yml
├── final
│ └── SignUpForm
│ │ ├── SignUpForm
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ ├── SignUpFormApp.swift
│ │ └── Extensions
│ │ │ └── Publishers+Dump.swift
│ │ └── SignUpForm.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
└── starter
│ └── SignUpForm
│ ├── SignUpForm
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ └── SignUpFormApp.swift
│ └── SignUpForm.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ ├── IDEWorkspaceChecks.plist
│ └── swiftpm
│ └── Package.resolved
├── Chapter 12 - Wrapping existing APIs in Combine
└── WrappingExistingAPIsInCombine
│ ├── data
│ ├── auth_export
│ │ ├── config.json
│ │ └── accounts.json
│ ├── firestore_export
│ │ ├── all_namespaces
│ │ │ └── all_kinds
│ │ │ │ ├── output-0
│ │ │ │ └── all_namespaces_all_kinds.export_metadata
│ │ └── firestore_export.overall_export_metadata
│ └── firebase-export-metadata.json
│ ├── firestore.indexes.json
│ ├── start.sh
│ ├── .firebaserc
│ ├── WrappingExistingAPIsInCombine
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ └── Models
│ │ └── Book.swift
│ ├── firestore.rules
│ ├── WrappingExistingAPIsInCombine.xcodeproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ └── firebase.json
├── images
└── 9781484285718-L.png
├── Chapter 01 - A New Beginning
└── Hello SwiftUI
│ ├── Hello SwiftUI
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── ContentView.swift
│ └── Hello_SwiftUIApp.swift
│ └── Hello SwiftUI.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── Chapter 06 - Building Input Forms
├── BookShelf
│ ├── BookShelf
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ ├── Changer
│ │ │ │ ├── Contents.json
│ │ │ │ ├── 9781916265202-L.imageset
│ │ │ │ │ ├── 9781916265202-L.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── 9781916265202-M.imageset
│ │ │ │ │ ├── 9781916265202-M.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ └── 9781916265202-S.imageset
│ │ │ │ │ ├── 9781916265202-S.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ ├── SwiftUIAbsoluteBeginner
│ │ │ │ ├── Contents.json
│ │ │ │ ├── 9781484255155-L.imageset
│ │ │ │ │ ├── 9781484255155-L.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── 9781484255155-M.imageset
│ │ │ │ │ ├── 9781484255155-M.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ └── 9781484255155-S.imageset
│ │ │ │ │ ├── 9781484255155-S.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ ├── Modern Concurrency on Apple Platforms
│ │ │ │ ├── Contents.json
│ │ │ │ ├── 9781484286944-L.imageset
│ │ │ │ │ ├── 9781484286944-L.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── 9781484286944-M.imageset
│ │ │ │ │ ├── 9781484286944-M.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ └── 9781484286944-S.imageset
│ │ │ │ │ ├── 9781484286944-S.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ ├── Asynchronous Programming with SwiftUI and Combine
│ │ │ │ ├── Contents.json
│ │ │ │ ├── 9781484285718-L.imageset
│ │ │ │ │ ├── 9781484285718-L.png
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── 9781484285718-M.imageset
│ │ │ │ │ ├── 9781484285718-M.png
│ │ │ │ │ └── Contents.json
│ │ │ │ └── 9781484285718-S.png.imageset
│ │ │ │ │ ├── 9781484285718-S.png
│ │ │ │ │ └── Contents.json
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ ├── ViewModels
│ │ │ └── BooksViewModel.swift
│ │ ├── Utils
│ │ │ └── ISBN.swift
│ │ ├── BooksListScreen.swift
│ │ ├── Views
│ │ │ └── BooksListView.swift
│ │ └── App
│ │ │ └── BookShelfApp.swift
│ └── BookShelf.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── FormsExamples
│ ├── FormsExamples
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── book-cover-combine.imageset
│ │ │ ├── 9781484285718-L.png
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── FormsExamplesApp.swift
│ └── ContentView.swift
│ └── FormsExamples.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── Chapter 03 - SwiftUI Building Blocks
├── SimpleView
│ ├── SimpleView
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ ├── ContentView.swift
│ │ └── SimpleViewApp.swift
│ └── SimpleView.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── ViewHierarchy
│ ├── ViewHierarchy
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── ViewHierarchyApp.swift
│ ├── ViewHierarchyTV
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ ├── App Icon & Top Shelf Image.brandassets
│ │ │ │ ├── App Icon.imagestack
│ │ │ │ │ ├── Back.imagestacklayer
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Front.imagestacklayer
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Middle.imagestacklayer
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── App Icon - App Store.imagestack
│ │ │ │ │ ├── Back.imagestacklayer
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Front.imagestacklayer
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Middle.imagestacklayer
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Top Shelf Image.imageset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Top Shelf Image Wide.imageset
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── ViewHierarchyTVApp.swift
│ └── ViewHierarchy.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── ViewModifiers
│ ├── ViewModifiers
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ └── ViewModifiersApp.swift
│ └── ViewModifiers.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── Chapter 04 - State Management
└── StateManagement
│ ├── StateManagement
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── StateManagementApp.swift
│ ├── Utilities
│ │ └── Introduction.swift
│ └── EnvironmentObject
│ │ └── UserProfileScreen.swift
│ └── StateManagement.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── Chapter 05 - Displaying Data in Lists
├── Feedback_Drilldown
│ ├── Drilldown
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── DrilldownApp.swift
│ └── Drilldown.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── ListsExample
│ ├── ListsExample
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── Changer
│ │ │ ├── Contents.json
│ │ │ ├── 9781916265202-L.imageset
│ │ │ │ ├── 9781916265202-L.jpeg
│ │ │ │ └── Contents.json
│ │ │ ├── 9781916265202-M.imageset
│ │ │ │ ├── 9781916265202-M.jpeg
│ │ │ │ └── Contents.json
│ │ │ └── 9781916265202-S.imageset
│ │ │ │ ├── 9781916265202-S.jpeg
│ │ │ │ └── Contents.json
│ │ ├── Hitchhiker
│ │ │ ├── Contents.json
│ │ │ ├── 9780671461492-L.imageset
│ │ │ │ ├── 9780671461492-L.jpeg
│ │ │ │ └── Contents.json
│ │ │ ├── 9780671461492-M.imageset
│ │ │ │ ├── 9780671461492-M.jpeg
│ │ │ │ └── Contents.json
│ │ │ └── 9780671461492-S.imageset
│ │ │ │ ├── 9780671461492-S.jpeg
│ │ │ │ └── Contents.json
│ │ ├── LoremIpsum
│ │ │ ├── Contents.json
│ │ │ ├── 9781234567890-L.imageset
│ │ │ │ ├── 9781234567890-L.png
│ │ │ │ └── Contents.json
│ │ │ ├── 9781234567890-M.imageset
│ │ │ │ ├── 9781234567890-M.png
│ │ │ │ └── Contents.json
│ │ │ └── 9781234567890-S.imageset
│ │ │ │ ├── 9781234567890-S.png
│ │ │ │ └── Contents.json
│ │ ├── Why we sleep
│ │ │ ├── Contents.json
│ │ │ ├── 9780141983769-L.imageset
│ │ │ │ ├── 9780141983769-L.jpeg
│ │ │ │ └── Contents.json
│ │ │ ├── 9780141983769-M.imageset
│ │ │ │ ├── 9780141983769-M.jpeg
│ │ │ │ └── Contents.json
│ │ │ └── 9780141983769-S.imageset
│ │ │ │ ├── 9780141983769-S.jpeg
│ │ │ │ └── Contents.json
│ │ ├── SwiftUIAbsoluteBeginner
│ │ │ ├── Contents.json
│ │ │ ├── 9781484255155-L.imageset
│ │ │ │ ├── 9781484255155-L.jpeg
│ │ │ │ └── Contents.json
│ │ │ ├── 9781484255155-M.imageset
│ │ │ │ ├── 9781484255155-M.jpeg
│ │ │ │ └── Contents.json
│ │ │ └── 9781484255155-S.imageset
│ │ │ │ ├── 9781484255155-S.jpeg
│ │ │ │ └── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── App
│ │ └── ListsExampleApp.swift
│ ├── Styling
│ │ ├── StyleAccentColor.swift
│ │ └── List Styles
│ │ │ ├── InsetStyleListView.swift
│ │ │ ├── PlainStyleListView.swift
│ │ │ ├── GroupedStyleListView.swift
│ │ │ ├── SidebarStyleListView.swift
│ │ │ ├── AutomaticStyleListView.swift
│ │ │ └── InsetGroupedStyleListView.swift
│ ├── Utilities
│ │ └── Introduction.swift
│ └── Static Lists
│ │ └── StaticListView.swift
│ └── ListsExample.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ ├── IDEWorkspaceChecks.plist
│ └── swiftpm
│ └── Package.resolved
├── Chapter 15 - Using async await in SwiftUI
└── WordBrowser
│ ├── WordBrowser
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── WordBrowserApp.swift
│ ├── WordsAPI-Info-Sample.plist
│ └── Views
│ │ └── DefinitionView.swift
│ └── WordBrowser.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── Chapter 02 - Getting Started with SwiftUI
├── final
│ └── BookShelf
│ │ ├── BookShelf
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ ├── Changer
│ │ │ │ ├── Contents.json
│ │ │ │ ├── 9781916265202-L.imageset
│ │ │ │ │ ├── 9781916265202-L.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── 9781916265202-M.imageset
│ │ │ │ │ ├── 9781916265202-M.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ └── 9781916265202-S.imageset
│ │ │ │ │ ├── 9781916265202-S.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ ├── SwiftUIAbsoluteBeginner
│ │ │ │ ├── Contents.json
│ │ │ │ ├── 9781484255155-L.imageset
│ │ │ │ │ ├── 9781484255155-L.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── 9781484255155-M.imageset
│ │ │ │ │ ├── 9781484255155-M.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ └── 9781484255155-S.imageset
│ │ │ │ │ ├── 9781484255155-S.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ ├── Modern Concurrency on Apple Platforms
│ │ │ │ ├── Contents.json
│ │ │ │ ├── 9781484286944-L.imageset
│ │ │ │ │ ├── 9781484286944-L.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── 9781484286944-M.imageset
│ │ │ │ │ ├── 9781484286944-M.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ │ └── 9781484286944-S.imageset
│ │ │ │ │ ├── 9781484286944-S.jpeg
│ │ │ │ │ └── Contents.json
│ │ │ ├── Asynchronous Programming with SwiftUI and Combine
│ │ │ │ ├── Contents.json
│ │ │ │ ├── 9781484285718-L.imageset
│ │ │ │ │ ├── 9781484285718-L.png
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── 9781484285718-M.imageset
│ │ │ │ │ ├── 9781484285718-M.png
│ │ │ │ │ └── Contents.json
│ │ │ │ └── 9781484285718-S.png.imageset
│ │ │ │ │ ├── 9781484285718-S.png
│ │ │ │ │ └── Contents.json
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── BookShelfApp.swift
│ │ └── BookShelf.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── starter
│ └── BookShelf
│ ├── BookShelf
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── Changer
│ │ │ ├── Contents.json
│ │ │ ├── 9781916265202-L.imageset
│ │ │ │ ├── 9781916265202-L.jpeg
│ │ │ │ └── Contents.json
│ │ │ ├── 9781916265202-M.imageset
│ │ │ │ ├── 9781916265202-M.jpeg
│ │ │ │ └── Contents.json
│ │ │ └── 9781916265202-S.imageset
│ │ │ │ ├── 9781916265202-S.jpeg
│ │ │ │ └── Contents.json
│ │ ├── SwiftUICombine
│ │ │ ├── Contents.json
│ │ │ ├── swiftuicombine-L.imageset
│ │ │ │ ├── swiftuicombine-L.png
│ │ │ │ └── Contents.json
│ │ │ ├── swiftuicombine-M.imageset
│ │ │ │ ├── swiftuicombine-M.png
│ │ │ │ └── Contents.json
│ │ │ └── swiftuicombine-S.imageset
│ │ │ │ ├── swiftuicombine-S.png
│ │ │ │ └── Contents.json
│ │ ├── SwiftUIAbsoluteBeginner
│ │ │ ├── Contents.json
│ │ │ ├── 9781484255155-L.imageset
│ │ │ │ ├── 9781484255155-L.jpeg
│ │ │ │ └── Contents.json
│ │ │ ├── 9781484255155-M.imageset
│ │ │ │ ├── 9781484255155-M.jpeg
│ │ │ │ └── Contents.json
│ │ │ └── 9781484255155-S.imageset
│ │ │ │ ├── 9781484255155-S.jpeg
│ │ │ │ └── Contents.json
│ │ ├── Modern Concurrency on Apple Platforms
│ │ │ ├── Contents.json
│ │ │ ├── 9781484286944-L.imageset
│ │ │ │ ├── 9781484286944-L.jpeg
│ │ │ │ └── Contents.json
│ │ │ ├── 9781484286944-M.imageset
│ │ │ │ ├── 9781484286944-M.jpeg
│ │ │ │ └── Contents.json
│ │ │ └── 9781484286944-S.imageset
│ │ │ │ ├── 9781484286944-S.jpeg
│ │ │ │ └── Contents.json
│ │ ├── Asynchronous Programming with SwiftUI and Combine
│ │ │ ├── Contents.json
│ │ │ ├── 9781484285718-L.imageset
│ │ │ │ ├── 9781484285718-L.png
│ │ │ │ └── Contents.json
│ │ │ ├── 9781484285718-M.imageset
│ │ │ │ ├── 9781484285718-M.png
│ │ │ │ └── Contents.json
│ │ │ └── 9781484285718-S.png.imageset
│ │ │ │ ├── 9781484285718-S.png
│ │ │ │ └── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── BookShelfApp.swift
│ └── ContentView.swift
│ └── BookShelf.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── Chapter 08 - Driving UI State with Combine
├── final
│ └── SignUpForm
│ │ ├── SignUpForm
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── SignUpFormApp.swift
│ │ └── SignUpForm.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── starter
│ └── SignUpForm
│ │ ├── SignUpForm
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── SignUpFormApp.swift
│ │ └── SignUpForm.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── steps
│ ├── step 1
│ │ └── SignUpForm
│ │ │ ├── SignUpForm
│ │ │ ├── Assets.xcassets
│ │ │ │ ├── Contents.json
│ │ │ │ └── AccentColor.colorset
│ │ │ │ │ └── Contents.json
│ │ │ ├── Preview Content
│ │ │ │ └── Preview Assets.xcassets
│ │ │ │ │ └── Contents.json
│ │ │ └── SignUpFormApp.swift
│ │ │ └── SignUpForm.xcodeproj
│ │ │ └── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ ├── step 2
│ │ └── SignUpForm
│ │ │ ├── SignUpForm
│ │ │ ├── Assets.xcassets
│ │ │ │ ├── Contents.json
│ │ │ │ └── AccentColor.colorset
│ │ │ │ │ └── Contents.json
│ │ │ ├── Preview Content
│ │ │ │ └── Preview Assets.xcassets
│ │ │ │ │ └── Contents.json
│ │ │ └── SignUpFormApp.swift
│ │ │ └── SignUpForm.xcodeproj
│ │ │ └── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── step 3
│ │ └── SignUpForm
│ │ ├── SignUpForm
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── SignUpFormApp.swift
│ │ └── SignUpForm.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── exercises
│ ├── solution 1
│ └── SignUpForm
│ │ ├── SignUpForm
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── SignUpFormApp.swift
│ │ └── SignUpForm.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ ├── solution 2
│ └── SignUpForm
│ │ ├── SignUpForm
│ │ ├── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ └── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Preview Content
│ │ │ └── Preview Assets.xcassets
│ │ │ │ └── Contents.json
│ │ └── SignUpFormApp.swift
│ │ └── SignUpForm.xcodeproj
│ │ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
│ └── solution 3
│ └── SignUpForm
│ ├── SignUpForm
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ └── SignUpFormApp.swift
│ └── SignUpForm.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ ├── IDEWorkspaceChecks.plist
│ └── swiftpm
│ └── Package.resolved
├── Chapter 16 - Bringing it all together
└── CombiningAsync
│ ├── CombiningAsync
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── App
│ │ └── CombiningAsyncApp.swift
│ └── Common
│ │ └── Views
│ │ └── BookSearchRowView.swift
│ └── CombiningAsync.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── Chapter 07 - Getting Started with Combine
├── Running.png
├── PlaygroundsApp.png
├── Getting Stared with Combine Playground.playground
│ ├── contents.xcplayground
│ └── Pages
│ │ ├── Publishers.xcplaygroundpage
│ │ └── Contents.swift
│ │ └── Introduction.xcplaygroundpage
│ │ └── Contents.swift
└── README.md
├── Chapter 13 - Combine Schedulers and SwiftUI
└── Schedulers
│ └── SwiftUICombineSchedulers
│ ├── SwiftUICombineSchedulers
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AccentColor.colorset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── App
│ │ └── SwiftUICombineSchedulersApp.swift
│ └── Utilities
│ │ ├── Thread.swift
│ │ └── ButtonStyles.swift
│ └── SwiftUICombineSchedulers.xcodeproj
│ └── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── Chapter 14 - Getting Started with async-await
└── Getting Started with async await Playground.playground
│ ├── Sources
│ └── Utilities.swift
│ └── contents.xcplayground
└── .github
└── ISSUE_TEMPLATE
├── typo.md
└── bug_report.md
/deprecated/Server/server/Sources/App/Controllers/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/deprecated/Server/server/.dockerignore:
--------------------------------------------------------------------------------
1 | .build/
2 | .swiftpm/
3 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/server/Sources/App/Controllers/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/server/Sources/App/Controllers/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/server/.dockerignore:
--------------------------------------------------------------------------------
1 | .build/
2 | .swiftpm/
3 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/server/.dockerignore:
--------------------------------------------------------------------------------
1 | .build/
2 | .swiftpm/
3 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/server/Sources/App/Controllers/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/server/.dockerignore:
--------------------------------------------------------------------------------
1 | .build/
2 | .swiftpm/
3 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/data/auth_export/config.json:
--------------------------------------------------------------------------------
1 | {"signIn":{"allowDuplicateEmails":false}}
--------------------------------------------------------------------------------
/images/9781484285718-L.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/images/9781484285718-L.png
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/firestore.indexes.json:
--------------------------------------------------------------------------------
1 | {
2 | "indexes": [],
3 | "fieldOverrides": []
4 | }
5 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/start.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | firebase emulators:start --import=./data --export-on-exit
3 |
--------------------------------------------------------------------------------
/deprecated/Server/server/.gitignore:
--------------------------------------------------------------------------------
1 | Packages
2 | .build
3 | xcuserdata
4 | *.xcodeproj
5 | DerivedData/
6 | .DS_Store
7 | db.sqlite
8 | .swiftpm
9 |
10 |
--------------------------------------------------------------------------------
/Chapter 01 - A New Beginning/Hello SwiftUI/Hello SwiftUI/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/deprecated/Server/server/Sources/App/Models/User.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | struct UserAvailable: Content {
4 | var isAvailable: Bool
5 | var userName: String
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/SimpleView/SimpleView/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 04 - State Management/StateManagement/StateManagement/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "swiftcombinebookfirestore"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchy/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewModifiers/ViewModifiers/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/Feedback_Drilldown/Drilldown/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/final/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/server/.gitignore:
--------------------------------------------------------------------------------
1 | Packages
2 | .build
3 | xcuserdata
4 | *.xcodeproj
5 | DerivedData/
6 | .DS_Store
7 | db.sqlite
8 | .swiftpm
9 |
10 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/starter/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/final/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 15 - Using async await in SwiftUI/WordBrowser/WordBrowser/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/final/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/server/.gitignore:
--------------------------------------------------------------------------------
1 | Packages
2 | .build
3 | xcuserdata
4 | *.xcodeproj
5 | DerivedData/
6 | .DS_Store
7 | db.sqlite
8 | .swiftpm
9 |
10 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/starter/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 16 - Bringing it all together/CombiningAsync/CombiningAsync/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/starter/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/server/Sources/App/Models/User.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | struct UserAvailable: Content {
4 | var isAvailable: Bool
5 | var userName: String
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 01 - A New Beginning/Hello SwiftUI/Hello SwiftUI/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 1/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 2/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 3/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/final/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/server/.gitignore:
--------------------------------------------------------------------------------
1 | Packages
2 | .build
3 | xcuserdata
4 | *.xcodeproj
5 | DerivedData/
6 | .DS_Store
7 | db.sqlite
8 | .swiftpm
9 |
10 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/starter/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/SimpleView/SimpleView/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 04 - State Management/StateManagement/StateManagement/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 07 - Getting Started with Combine/Running.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 07 - Getting Started with Combine/Running.png
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 1/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 2/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 3/SignUpForm/SignUpForm/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/server/Sources/App/Models/User.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | struct UserAvailable: Content {
4 | var isAvailable: Bool
5 | var userName: String?
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchy/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewModifiers/ViewModifiers/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/Feedback_Drilldown/Drilldown/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/final/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/starter/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/final/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 15 - Using async await in SwiftUI/WordBrowser/WordBrowser/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 16 - Bringing it all together/CombiningAsync/CombiningAsync/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/final/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/starter/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/starter/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/server/Sources/App/Models/User.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | struct UserAvailable: Content {
4 | var isAvailable: Bool
5 | var userName: String?
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 07 - Getting Started with Combine/PlaygroundsApp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 07 - Getting Started with Combine/PlaygroundsApp.png
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 1/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 2/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 3/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/deprecated/Server/server/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "lldb.library": "/Applications/Xcode-13.2.0-Release.Candidate.app/Contents/SharedFrameworks/LLDB.framework/Versions/A/LLDB",
3 | "editor.tabSize": 2
4 | }
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/final/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/starter/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/WrappingExistingAPIsInCombine/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 13 - Combine Schedulers and SwiftUI/Schedulers/SwiftUICombineSchedulers/SwiftUICombineSchedulers/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 1/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 2/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 3/SignUpForm/SignUpForm/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/WrappingExistingAPIsInCombine/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 13 - Combine Schedulers and SwiftUI/Schedulers/SwiftUICombineSchedulers/SwiftUICombineSchedulers/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 01 - A New Beginning/Hello SwiftUI/Hello SwiftUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/SimpleView/SimpleView.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/deprecated/Server/server/Sources/Run/main.swift:
--------------------------------------------------------------------------------
1 | import App
2 | import Vapor
3 |
4 | var env = try Environment.detect()
5 | try LoggingSystem.bootstrap(from: &env)
6 | let app = Application(env)
7 | defer { app.shutdown() }
8 | try configure(app)
9 | try app.run()
10 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchy.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewModifiers/ViewModifiers.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 04 - State Management/StateManagement/StateManagement.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/firestore.rules:
--------------------------------------------------------------------------------
1 | rules_version = '2';
2 | service cloud.firestore {
3 | match /databases/{database}/documents {
4 | match /{document=**} {
5 | allow read, write: if true;
6 | }
7 | }
8 | }
--------------------------------------------------------------------------------
/Chapter 15 - Using async await in SwiftUI/WordBrowser/WordBrowser.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 01 - A New Beginning/Hello SwiftUI/Hello SwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/SimpleView/SimpleView/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/Feedback_Drilldown/Drilldown.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 16 - Bringing it all together/CombiningAsync/CombiningAsync.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/deprecated/Playground/MyPlayground.playground/contents.xcplayground:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchy/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewModifiers/ViewModifiers/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/Feedback_Drilldown/Drilldown/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 1/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 2/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 3/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/final/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/server/Sources/Run/main.swift:
--------------------------------------------------------------------------------
1 | import App
2 | import Vapor
3 |
4 | var env = try Environment.detect()
5 | try LoggingSystem.bootstrap(from: &env)
6 | let app = Application(env)
7 | defer { app.shutdown() }
8 | try configure(app)
9 | try app.run()
10 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/starter/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/final/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/starter/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 15 - Using async await in SwiftUI/WordBrowser/WordBrowser/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 16 - Bringing it all together/CombiningAsync/CombiningAsync/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 1/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 2/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 3/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/final/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/starter/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/server/Sources/Run/main.swift:
--------------------------------------------------------------------------------
1 | import App
2 | import Vapor
3 |
4 | var env = try Environment.detect()
5 | try LoggingSystem.bootstrap(from: &env)
6 | let app = Application(env)
7 | defer { app.shutdown() }
8 | try configure(app)
9 | try app.run()
10 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 1/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 2/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 3/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/final/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/server/Sources/Run/main.swift:
--------------------------------------------------------------------------------
1 | import App
2 | import Vapor
3 |
4 | var env = try Environment.detect()
5 | try LoggingSystem.bootstrap(from: &env)
6 | let app = Application(env)
7 | defer { app.shutdown() }
8 | try configure(app)
9 | try app.run()
10 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/starter/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 1/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 2/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 3/SignUpForm/SignUpForm/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 13 - Combine Schedulers and SwiftUI/Schedulers/SwiftUICombineSchedulers/SwiftUICombineSchedulers.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/WrappingExistingAPIsInCombine.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/WrappingExistingAPIsInCombine/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 13 - Combine Schedulers and SwiftUI/Schedulers/SwiftUICombineSchedulers/SwiftUICombineSchedulers/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-L.imageset/9781916265202-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-L.imageset/9781916265202-L.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-M.imageset/9781916265202-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-M.imageset/9781916265202-M.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-S.imageset/9781916265202-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-S.imageset/9781916265202-S.jpeg
--------------------------------------------------------------------------------
/Chapter 01 - A New Beginning/Hello SwiftUI/Hello SwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/ViewModels/BooksViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BooksViewModel.swift
3 | // BookShelf
4 | //
5 | // Created by Peter Friese on 06.03.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | class BooksViewModel: ObservableObject {
11 | @Published var books: [Book] = Book.sampleBooks
12 | }
13 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples/Assets.xcassets/book-cover-combine.imageset/9781484285718-L.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples/Assets.xcassets/book-cover-combine.imageset/9781484285718-L.png
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/SimpleView/SimpleView/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchy/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewModifiers/ViewModifiers/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/9781916265202-L.imageset/9781916265202-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/9781916265202-L.imageset/9781916265202-L.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/9781916265202-M.imageset/9781916265202-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/9781916265202-M.imageset/9781916265202-M.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/9781916265202-S.imageset/9781916265202-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/9781916265202-S.imageset/9781916265202-S.jpeg
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/data/firestore_export/all_namespaces/all_kinds/output-0:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/data/firestore_export/all_namespaces/all_kinds/output-0
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/9781234567890-L.imageset/9781234567890-L.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/9781234567890-L.imageset/9781234567890-L.png
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/9781234567890-M.imageset/9781234567890-M.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/9781234567890-M.imageset/9781234567890-M.png
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/9781234567890-S.imageset/9781234567890-S.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/9781234567890-S.imageset/9781234567890-S.png
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-L.imageset/9781916265202-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-L.imageset/9781916265202-L.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-M.imageset/9781916265202-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-M.imageset/9781916265202-M.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-S.imageset/9781916265202-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-S.imageset/9781916265202-S.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/9780671461492-L.imageset/9780671461492-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/9780671461492-L.imageset/9780671461492-L.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/9780671461492-M.imageset/9780671461492-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/9780671461492-M.imageset/9780671461492-M.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/9780671461492-S.imageset/9780671461492-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/9780671461492-S.imageset/9780671461492-S.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/9780141983769-L.imageset/9780141983769-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/9780141983769-L.imageset/9780141983769-L.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/9780141983769-M.imageset/9780141983769-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/9780141983769-M.imageset/9780141983769-M.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/9780141983769-S.imageset/9780141983769-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/9780141983769-S.imageset/9780141983769-S.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-L.imageset/9781916265202-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-L.imageset/9781916265202-L.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-M.imageset/9781916265202-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-M.imageset/9781916265202-M.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-S.imageset/9781916265202-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-S.imageset/9781916265202-S.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/9781484255155-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/9781484255155-L.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/9781484255155-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/9781484255155-M.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/9781484255155-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/9781484255155-S.jpeg
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/data/firestore_export/firestore_export.overall_export_metadata:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/data/firestore_export/firestore_export.overall_export_metadata
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/Feedback_Drilldown/Drilldown/DrilldownApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DrilldownApp.swift
3 | // Drilldown
4 | //
5 | // Created by Peter Friese on 05.07.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct DrilldownApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/deprecated/Server/server/Sources/App/configure.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | // configures your application
4 | public func configure(_ app: Application) throws {
5 | // uncomment to serve files from /Public folder
6 | // app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
7 |
8 | // register routes
9 | try routes(app)
10 | }
11 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/swiftuicombine-L.imageset/swiftuicombine-L.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/swiftuicombine-L.imageset/swiftuicombine-L.png
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/swiftuicombine-M.imageset/swiftuicombine-M.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/swiftuicombine-M.imageset/swiftuicombine-M.png
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/swiftuicombine-S.imageset/swiftuicombine-S.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/swiftuicombine-S.imageset/swiftuicombine-S.png
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 01 - A New Beginning/Hello SwiftUI/Hello SwiftUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/SimpleView/SimpleView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/9781484255155-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/9781484255155-L.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/9781484255155-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/9781484255155-M.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/9781484255155-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/9781484255155-S.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples/FormsExamplesApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FormsExamplesApp.swift
3 | // FormsExamples
4 | //
5 | // Created by Peter Friese on 02.03.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct FormsExamplesApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/server/Sources/App/configure.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | // configures your application
4 | public func configure(_ app: Application) throws {
5 | // uncomment to serve files from /Public folder
6 | // app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
7 |
8 | // register routes
9 | try routes(app)
10 | }
11 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/9781484255155-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/9781484255155-L.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/9781484255155-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/9781484255155-M.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/9781484255155-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/9781484255155-S.jpeg
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewModifiers/ViewModifiers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 04 - State Management/StateManagement/StateManagement.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 04 - State Management/StateManagement/StateManagement/StateManagementApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StateManagementApp.swift
3 | // StateManagement
4 | //
5 | // Created by Peter Friese on 07.02.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct StateManagementApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | MenuScreen()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-L.imageset/9781484286944-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-L.imageset/9781484286944-L.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-M.imageset/9781484286944-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-M.imageset/9781484286944-M.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-S.imageset/9781484286944-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-S.imageset/9781484286944-S.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/server/Sources/App/configure.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | // configures your application
4 | public func configure(_ app: Application) throws {
5 | // uncomment to serve files from /Public folder
6 | // app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
7 |
8 | // register routes
9 | try routes(app)
10 | }
11 |
--------------------------------------------------------------------------------
/Chapter 15 - Using async await in SwiftUI/WordBrowser/WordBrowser.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/9781484255155-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/9781484255155-L.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/9781484255155-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/9781484255155-M.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/9781484255155-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/9781484255155-S.jpeg
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/Feedback_Drilldown/Drilldown.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 16 - Bringing it all together/CombiningAsync/CombiningAsync.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/server/Sources/App/configure.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | // configures your application
4 | public func configure(_ app: Application) throws {
5 | // uncomment to serve files from /Public folder
6 | // app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
7 |
8 | // register routes
9 | try routes(app)
10 | }
11 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 1/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 2/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 3/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 1/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 2/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 3/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/data/firebase-export-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "11.11.0",
3 | "firestore": {
4 | "version": "1.14.4",
5 | "path": "firestore_export",
6 | "metadata_file": "firestore_export/firestore_export.overall_export_metadata"
7 | },
8 | "auth": {
9 | "version": "11.11.0",
10 | "path": "auth_export"
11 | }
12 | }
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "firestore": {
3 | "rules": "firestore.rules",
4 | "indexes": "firestore.indexes.json"
5 | },
6 | "emulators": {
7 | "auth": {
8 | "port": 9099
9 | },
10 | "firestore": {
11 | "port": 8080
12 | },
13 | "ui": {
14 | "enabled": true
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-L.imageset/9781484285718-L.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-L.imageset/9781484285718-L.png
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-M.imageset/9781484285718-M.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-M.imageset/9781484285718-M.png
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/data/firestore_export/all_namespaces/all_kinds/all_namespaces_all_kinds.export_metadata:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/data/firestore_export/all_namespaces/all_kinds/all_namespaces_all_kinds.export_metadata
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-L.imageset/9781484286944-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-L.imageset/9781484286944-L.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-M.imageset/9781484286944-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-M.imageset/9781484286944-M.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-S.imageset/9781484286944-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-S.imageset/9781484286944-S.jpeg
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-S.png.imageset/9781484285718-S.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-S.png.imageset/9781484285718-S.png
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-L.imageset/9781484286944-L.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-L.imageset/9781484286944-L.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-M.imageset/9781484286944-M.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-M.imageset/9781484286944-M.jpeg
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-S.imageset/9781484286944-S.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-S.imageset/9781484286944-S.jpeg
--------------------------------------------------------------------------------
/Chapter 15 - Using async await in SwiftUI/WordBrowser/WordBrowser/WordBrowserApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WordBrowserApp.swift
3 | // WordBrowser
4 | //
5 | // Created by Peter Friese on 16.06.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct WordBrowserApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | LibraryView()
16 | }
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Chapter 15 - Using async await in SwiftUI/WordBrowser/WordBrowser/WordsAPI-Info-Sample.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | API_KEY
6 | _YOUR_API_KEY
7 | API_HOST
8 | _YOUR_API_HOST
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Chapter 13 - Combine Schedulers and SwiftUI/Schedulers/SwiftUICombineSchedulers/SwiftUICombineSchedulers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/App/ListsExampleApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListsExampleApp.swift
3 | // ListsExample
4 | //
5 | // Created by Peter Friese on 30.06.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct ListsExampleApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | MenuScreen()
15 | .accentColor(Color(UIColor.systemPink))
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/WrappingExistingAPIsInCombine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-L.imageset/9781484285718-L.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-L.imageset/9781484285718-L.png
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-M.imageset/9781484285718-M.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-M.imageset/9781484285718-M.png
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-L.imageset/9781484285718-L.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-L.imageset/9781484285718-L.png
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-M.imageset/9781484285718-M.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-M.imageset/9781484285718-M.png
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-S.png.imageset/9781484285718-S.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-S.png.imageset/9781484285718-S.png
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-S.png.imageset/9781484285718-S.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/peterfriese/Asynchronous-Programming-with-SwiftUI-and-Combine/HEAD/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-S.png.imageset/9781484285718-S.png
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/starter/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpForm()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/final/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpForm()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/final/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpFormScreen()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/final/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpScreen()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "author" : "xcode",
14 | "version" : 1
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "author" : "xcode",
14 | "version" : 1
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "author" : "xcode",
14 | "version" : 1
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/starter/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpForm()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/starter/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpFormScreen()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 1/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpForm()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 2/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpForm()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/steps/step 3/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpForm()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/final/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpScreen()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | },
6 | "layers" : [
7 | {
8 | "filename" : "Front.imagestacklayer"
9 | },
10 | {
11 | "filename" : "Middle.imagestacklayer"
12 | },
13 | {
14 | "filename" : "Back.imagestacklayer"
15 | }
16 | ]
17 | }
18 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 1/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpForm()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 2/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpForm()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 3/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpForm()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/starter/SignUpForm/SignUpForm/SignUpFormApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SignUpFormApp.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 27.12.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SignUpFormApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | SignUpScreen()
16 | .navigationTitle("Sign up")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | },
6 | "layers" : [
7 | {
8 | "filename" : "Front.imagestacklayer"
9 | },
10 | {
11 | "filename" : "Middle.imagestacklayer"
12 | },
13 | {
14 | "filename" : "Back.imagestacklayer"
15 | }
16 | ]
17 | }
18 |
--------------------------------------------------------------------------------
/Chapter 14 - Getting Started with async-await/Getting Started with async await Playground.playground/Sources/Utilities.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | public func customerSays(_ message: String) {
4 | print("[Customer] \(message)")
5 | }
6 |
7 | public func sandwichMakerSays(_ message: String, waitFor time: UInt32 = 0) {
8 | print("[Sandwich maker] \(message)")
9 | if time > 0 {
10 | print(" ... this will take \(time)s")
11 | sleep(time)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter 16 - Bringing it all together/CombiningAsync/CombiningAsync/App/CombiningAsyncApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CombiningAsyncApp.swift
3 | // CombiningAsync
4 | //
5 | // Created by Peter Friese on 14.03.22.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct CombiningAsyncApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | MenuView()
16 | .navigationTitle("Combining Async")
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "pins" : [
3 | {
4 | "identity" : "loremswiftum",
5 | "kind" : "remoteSourceControl",
6 | "location" : "https://github.com/lukaskubanek/LoremSwiftum",
7 | "state" : {
8 | "revision" : "8942e732e50458cde5dccf9996afa16f29372853",
9 | "version" : "2.2.2"
10 | }
11 | }
12 | ],
13 | "version" : 2
14 | }
15 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/final/SignUpForm/SignUpForm/Extensions/Publishers+Dump.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Publishers+Dump.swift
3 | // SignUpForm
4 | //
5 | // Created by Peter Friese on 06.03.22.
6 | //
7 |
8 | import Foundation
9 | import Combine
10 |
11 | extension Publisher {
12 | func dump() -> AnyPublisher {
13 | handleEvents(receiveOutput: { value in
14 | Swift.dump(value)
15 | })
16 | .eraseToAnyPublisher()
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/deprecated/Server/server/Tests/AppTests/AppTests.swift:
--------------------------------------------------------------------------------
1 | @testable import App
2 | import XCTVapor
3 |
4 | final class AppTests: XCTestCase {
5 | func testHelloWorld() throws {
6 | let app = Application(.testing)
7 | defer { app.shutdown() }
8 | try configure(app)
9 |
10 | try app.test(.GET, "hello", afterResponse: { res in
11 | XCTAssertEqual(res.status, .ok)
12 | XCTAssertEqual(res.body.string, "Hello, world!")
13 | })
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Chapter 13 - Combine Schedulers and SwiftUI/Schedulers/SwiftUICombineSchedulers/SwiftUICombineSchedulers/App/SwiftUICombineSchedulersApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftUICombineSchedulersApp.swift
3 | // SwiftUICombineSchedulers
4 | //
5 | // Created by Peter Friese on 25.04.22.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct SwiftUICombineSchedulersApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | NavigationStack {
15 | MenuView()
16 | }
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples/Assets.xcassets/book-cover-combine.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-L.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Navajo-Swift",
6 | "repositoryURL": "https://github.com/jasonnam/Navajo-Swift",
7 | "state": {
8 | "branch": "master",
9 | "revision": "a8ca1756ed782e9d2fb412fa07227e756c25f948",
10 | "version": null
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/server/Tests/AppTests/AppTests.swift:
--------------------------------------------------------------------------------
1 | @testable import App
2 | import XCTVapor
3 |
4 | final class AppTests: XCTestCase {
5 | func testHelloWorld() throws {
6 | let app = Application(.testing)
7 | defer { app.shutdown() }
8 | try configure(app)
9 |
10 | try app.test(.GET, "hello", afterResponse: { res in
11 | XCTAssertEqual(res.status, .ok)
12 | XCTAssertEqual(res.body.string, "Hello, world!")
13 | })
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/data/auth_export/accounts.json:
--------------------------------------------------------------------------------
1 | {"kind":"identitytoolkit#DownloadAccountResponse","users":[{"localId":"lCzkr9PKFlBTopAkux96KHhyQ12L","createdAt":"1649768949227","lastLoginAt":"1649768949227","validSince":"1665251389","emailVerified":false,"disabled":false},{"localId":"zXG4Pc7WR2wLo5834arS3WunpUUu","createdAt":"1664622137589","lastLoginAt":"1664622137589","validSince":"1665251389","emailVerified":false,"disabled":false,"lastRefreshAt":"2022-10-08T17:50:06.314Z"}]}
--------------------------------------------------------------------------------
/Chapter 04 - State Management/StateManagement/StateManagement/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "display-p3",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.886",
9 | "green" : "0.344",
10 | "red" : "0.855"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/9781916265202-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/9781916265202-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Changer/9781916265202-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/9781234567890-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781234567890-L.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/9781234567890-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781234567890-M.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/LoremIpsum/9781234567890-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781234567890-S.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Navajo-Swift",
6 | "repositoryURL": "https://github.com/jasonnam/Navajo-Swift",
7 | "state": {
8 | "branch": "master",
9 | "revision": "a8ca1756ed782e9d2fb412fa07227e756c25f948",
10 | "version": null
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Navajo-Swift",
6 | "repositoryURL": "https://github.com/jasonnam/Navajo-Swift",
7 | "state": {
8 | "branch": "master",
9 | "revision": "a8ca1756ed782e9d2fb412fa07227e756c25f948",
10 | "version": null
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/server/Tests/AppTests/AppTests.swift:
--------------------------------------------------------------------------------
1 | @testable import App
2 | import XCTVapor
3 |
4 | final class AppTests: XCTestCase {
5 | func testHelloWorld() throws {
6 | let app = Application(.testing)
7 | defer { app.shutdown() }
8 | try configure(app)
9 |
10 | try app.test(.GET, "hello", afterResponse: { res in
11 | XCTAssertEqual(res.status, .ok)
12 | XCTAssertEqual(res.body.string, "Hello, world!")
13 | })
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Navajo-Swift",
6 | "repositoryURL": "https://github.com/jasonnam/Navajo-Swift",
7 | "state": {
8 | "branch": "master",
9 | "revision": "a8ca1756ed782e9d2fb412fa07227e756c25f948",
10 | "version": null
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Changer/9781916265202-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781916265202-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/9780671461492-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9780671461492-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/9780671461492-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9780671461492-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Hitchhiker/9780671461492-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9780671461492-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/9780141983769-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9780141983769-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/9780141983769-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9780141983769-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/Why we sleep/9780141983769-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9780141983769-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/final/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Navajo-Swift",
6 | "repositoryURL": "https://github.com/jasonnam/Navajo-Swift",
7 | "state": {
8 | "branch": "master",
9 | "revision": "a8ca1756ed782e9d2fb412fa07227e756c25f948",
10 | "version": null
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/server/Tests/AppTests/AppTests.swift:
--------------------------------------------------------------------------------
1 | @testable import App
2 | import XCTVapor
3 |
4 | final class AppTests: XCTestCase {
5 | func testHelloWorld() throws {
6 | let app = Application(.testing)
7 | defer { app.shutdown() }
8 | try configure(app)
9 |
10 | try app.test(.GET, "hello", afterResponse: { res in
11 | XCTAssertEqual(res.status, .ok)
12 | XCTAssertEqual(res.body.string, "Hello, world!")
13 | })
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/starter/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Navajo-Swift",
6 | "repositoryURL": "https://github.com/jasonnam/Navajo-Swift",
7 | "state": {
8 | "branch": "master",
9 | "revision": "a8ca1756ed782e9d2fb412fa07227e756c25f948",
10 | "version": null
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/swiftuicombine-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "swiftuicombine-L.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/swiftuicombine-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "swiftuicombine-M.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUICombine/swiftuicombine-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "swiftuicombine-S.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 2/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Navajo-Swift",
6 | "repositoryURL": "https://github.com/jasonnam/Navajo-Swift",
7 | "state": {
8 | "branch": "master",
9 | "revision": "a8ca1756ed782e9d2fb412fa07227e756c25f948",
10 | "version": null
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 08 - Driving UI State with Combine/exercises/solution 3/SignUpForm/SignUpForm.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Navajo-Swift",
6 | "repositoryURL": "https://github.com/jasonnam/Navajo-Swift",
7 | "state": {
8 | "branch": "master",
9 | "revision": "a8ca1756ed782e9d2fb412fa07227e756c25f948",
10 | "version": null
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/SwiftUIAbsoluteBeginner/9781484255155-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484255155-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484286944-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484286944-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484286944-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-L.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-M.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484286944-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484286944-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484286944-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484286944-L.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484286944-M.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Modern Concurrency on Apple Platforms/9781484286944-S.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484286944-S.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-S.png.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-S.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 14 - Getting Started with async-await/Getting Started with async await Playground.playground/contents.xcplayground:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-L.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-M.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-L.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-L.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-M.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-M.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 13 - Combine Schedulers and SwiftUI/Schedulers/SwiftUICombineSchedulers/SwiftUICombineSchedulers/Utilities/Thread.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Thread.swift
3 | // SwiftUICombineSchedulers
4 | //
5 | // Created by Peter Friese on 14.05.22.
6 | //
7 |
8 | import Foundation
9 |
10 | extension Thread {
11 | static func printDebug() {
12 | print("isMainThread: \(Thread.isMainThread) | \(Thread.current)")
13 | }
14 |
15 | static func printDebug(tag: String) {
16 | print("[\(tag)] isMainThread: \(Thread.isMainThread) | \(Thread.current)")
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/typo.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Typo
3 | about: Found a typo in the book? Submit it here so I can fix it in the next issue.
4 | title: "[TYPO]"
5 | labels: typo
6 | assignees: peterfriese
7 |
8 | ---
9 |
10 | I found a typo in _Asynchronous Programming
with SwiftUI and Combine_.
11 |
12 | * Edition: 1st
13 | * Page:
14 |
15 | ### What is wrong
16 | (Please insert the misspelled word, including some context, so it is easier to find.)
17 |
18 | ### What's the correct spelling
19 | (Please insert the correctly spelled word.)
20 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-S.png.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-S.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/Assets.xcassets/Asynchronous Programming with SwiftUI and Combine/9781484285718-S.png.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "9781484285718-S.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter 12 - Wrapping existing APIs in Combine/WrappingExistingAPIsInCombine/WrappingExistingAPIsInCombine/Models/Book.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Book.swift
3 | // WrappingExistingAPIsInCombine
4 | //
5 | // Created by Peter Friese on 12.04.22.
6 | //
7 |
8 | import Foundation
9 | import FirebaseFirestoreSwift
10 |
11 | struct Book: Codable, Identifiable {
12 | @DocumentID var id: String?
13 | var title: String
14 | var numberOfPages: Int
15 | var author: String
16 | }
17 |
18 | extension Book {
19 | static let empty = Book(title: "", numberOfPages: 0, author: "")
20 | }
21 |
--------------------------------------------------------------------------------
/deprecated/Server/server/Sources/App/routes.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | func routes(_ app: Application) throws {
4 | app.get { req in
5 | return "It works!"
6 | }
7 |
8 | app.get("hello") { req -> String in
9 | return "Hello, world!"
10 | }
11 |
12 | app.get("isUserNameAvailable") { req -> UserAvailable in
13 | let userName: String = req.query["userName"] ?? "unknown"
14 | let isAvailable = !["peterfriese", "johnnyappleseed", "page", "johndoe"].contains(userName)
15 | return UserAvailable(isAvailable: isAvailable, userName: userName )
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "tv-marketing",
13 | "scale" : "1x"
14 | },
15 | {
16 | "idiom" : "tv-marketing",
17 | "scale" : "2x"
18 | }
19 | ],
20 | "info" : {
21 | "author" : "xcode",
22 | "version" : 1
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "tv-marketing",
13 | "scale" : "1x"
14 | },
15 | {
16 | "idiom" : "tv-marketing",
17 | "scale" : "2x"
18 | }
19 | ],
20 | "info" : {
21 | "author" : "xcode",
22 | "version" : 1
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Utils/ISBN.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ISBN.swift
3 | // BookShelf
4 | //
5 | // Created by Peter Friese on 06.03.21.
6 | //
7 |
8 | import Foundation
9 |
10 | // From http://rosettacode.org/wiki/ISBN13_check_digit#Swift
11 | func checkISBN(isbn: String) -> Bool {
12 | guard !isbn.isEmpty else {
13 | return false
14 | }
15 |
16 | let sum = isbn
17 | .compactMap { $0.wholeNumberValue }
18 | .enumerated()
19 | .map { $0.offset & 1 == 1 ? 3 * $0.element : $0.element }
20 | .reduce(0, +)
21 |
22 | return sum % 10 == 0
23 | }
24 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/server/Sources/App/routes.swift:
--------------------------------------------------------------------------------
1 | import Vapor
2 |
3 | func routes(_ app: Application) throws {
4 | app.get { req in
5 | return "It works!"
6 | }
7 |
8 | app.get("hello") { req -> String in
9 | return "Hello, world!"
10 | }
11 |
12 | app.get("isUserNameAvailable") { req -> UserAvailable in
13 | let userName: String = req.query["userName"] ?? "unknown"
14 | let isAvailable = !["peterfriese", "johnnyappleseed", "page", "johndoe"].contains(userName)
15 | return UserAvailable(isAvailable: isAvailable, userName: userName )
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/SimpleView/SimpleView/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // SimpleView
4 | //
5 | // Created by Peter Friese on 13.09.22.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ContentView: View {
11 | var body: some View {
12 | VStack {
13 | Image(systemName: "globe")
14 | .imageScale(.large)
15 | .foregroundColor(.accentColor)
16 | Text("Hello, world!")
17 | }
18 | .padding()
19 | }
20 | }
21 |
22 | struct ContentView_Previews: PreviewProvider {
23 | static var previews: some View {
24 | ContentView()
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "tv-marketing",
13 | "scale" : "1x"
14 | },
15 | {
16 | "idiom" : "tv-marketing",
17 | "scale" : "2x"
18 | }
19 | ],
20 | "info" : {
21 | "author" : "xcode",
22 | "version" : 1
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "tv-marketing",
13 | "scale" : "1x"
14 | },
15 | {
16 | "idiom" : "tv-marketing",
17 | "scale" : "2x"
18 | }
19 | ],
20 | "info" : {
21 | "author" : "xcode",
22 | "version" : 1
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "tv-marketing",
13 | "scale" : "1x"
14 | },
15 | {
16 | "idiom" : "tv-marketing",
17 | "scale" : "2x"
18 | }
19 | ],
20 | "info" : {
21 | "author" : "xcode",
22 | "version" : 1
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Chapter 07 - Getting Started with Combine/Getting Stared with Combine Playground.playground/contents.xcplayground:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/Chapter 16 - Bringing it all together/CombiningAsync/CombiningAsync/Common/Views/BookSearchRowView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BookSearchRowView.swift
3 | // CombiningAsync
4 | //
5 | // Created by Peter Friese on 14.03.22.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct BookSearchRowView: View {
11 | var book: Book
12 | var body: some View {
13 | VStack(alignment: .leading) {
14 | Text(book.title)
15 | .font(.headline)
16 | Text("by \(book.author)")
17 | .font(.subheadline)
18 | }
19 | }
20 | }
21 |
22 | struct BookSearchRowView_Previews: PreviewProvider {
23 | static var previews: some View {
24 | BookSearchRowView(book: Book.samples[0])
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Chapter 07 - Getting Started with Combine/Getting Stared with Combine Playground.playground/Pages/Publishers.xcplaygroundpage/Contents.swift:
--------------------------------------------------------------------------------
1 | //: [](@next)
2 |
3 | import Foundation
4 | import Combine
5 |
6 | let answerPublisher = Just(42)
7 |
8 | let answerSubscriber = Subscribers.Sink { completion in
9 | print("Received completion")
10 | } receiveValue: { value in
11 | print("I received value \(value) from publisher")
12 | }
13 |
14 | answerPublisher.subscribe(answerSubscriber)
15 |
16 |
17 | let answerSubscription = answerPublisher.sink { value in
18 | print("Received value \(value) from publisher")
19 | }
20 |
21 |
22 | //: [](@next)
23 |
--------------------------------------------------------------------------------
/Chapter 07 - Getting Started with Combine/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Combine
2 |
3 | I recommend opening this Xcode Playground with the Playgrounds app for macOS. While it is possible to open it in Xcode, you will have a nicer experience by using the standalone Playgrounds app.
4 |
5 | 
6 |
7 | ## How to use this
8 |
9 | ### Finding your way around
10 |
11 | - Open the playground file in the Playgrounds app.
12 | - Navigate around using the outline on the left. the _< Previous_, _Home_, _Next >_ links on the playground pages, and the links in the table of contents
13 |
14 | ### Running the code
15 |
16 | - Open the console (by clicking on the button at the bottom right)
17 | - Run the code by clicking the _Run_ button
18 |
19 | 
--------------------------------------------------------------------------------
/Chapter 15 - Using async await in SwiftUI/WordBrowser/WordBrowser/Views/DefinitionView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DefinitionView.swift
3 | // WordBrowser
4 | //
5 | // Created by Peter Friese on 16.06.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct DefinitionView: View {
11 | var definition: Definition
12 | var body: some View {
13 | HStack {
14 | VStack(alignment: .leading) {
15 | Text("(\(definition.partOfSpeech))")
16 | .font(.caption)
17 | Text(definition.definition)
18 | }
19 | Spacer()
20 | }
21 | }
22 | }
23 |
24 | struct DefinitionView_Previews: PreviewProvider {
25 | static var previews: some View {
26 | DefinitionView(definition: Word.sample.definitions![0])
27 | .previewLayout(.sizeThatFits)
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/BooksListScreen.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // BookShelf
4 | //
5 | // Created by Peter Friese on 02/01/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct BooksListView: View {
11 | var books: [Book]
12 | var body: some View {
13 | List {
14 | ForEach(books) { book in
15 | BookRowView(book: book)
16 | }
17 | .listRowBackground(Color(UIColor.systemGray6))
18 | }
19 | }
20 | }
21 |
22 | struct ContentView_Previews: PreviewProvider {
23 | static var previews: some View {
24 | Group {
25 | BooksListView(books: sampleBooks)
26 | .preferredColorScheme(.dark)
27 | BooksListView(books: sampleBooks)
28 | .preferredColorScheme(.light)
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Styling/StyleAccentColor.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StyleAccentColor.swift
3 | // ListsExample
4 | //
5 | // Created by Peter Friese on 25.09.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | // MARK: - Demo infrastructure
11 |
12 | struct StyleAccentColorDemo: View {
13 | var body: some View {
14 | VStack(alignment: .leading) {
15 | Introduction(Text("Use `.accentColor` to tint the color of the label images."))
16 | ListStylesBasicListView()
17 | .accentColor(Color.mint)
18 | }
19 | .navigationTitle("List Style: .sidebar")
20 | }
21 | }
22 |
23 | struct StyleAccentColor_Previews: PreviewProvider {
24 | static var previews: some View {
25 | NavigationStack {
26 | StyleAccentColorDemo()
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Styling/List Styles/InsetStyleListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InsetStyleListView.swift
3 | // ListsExample
4 | //
5 | // Created by Peter Friese on 25.09.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | // MARK: - Demo infrastructure
11 |
12 | struct InsetStyleListViewDemo: View {
13 | var body: some View {
14 | VStack(alignment: .leading) {
15 | Introduction(Text("List that use the `.inset` style: have separators, are inset, and not grouped. "))
16 | ListStylesBasicListView()
17 | .listStyle(.inset)
18 | }
19 | .navigationTitle("List Style: .inset")
20 | }
21 | }
22 |
23 | struct InsetStyleListView_Previews: PreviewProvider {
24 | static var previews: some View {
25 | NavigationStack {
26 | InsetStyleListViewDemo()
27 | }
28 | }
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Styling/List Styles/PlainStyleListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PlainStyleListView.swift
3 | // ListsExample
4 | //
5 | // Created by Peter Friese on 25.09.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | // MARK: - Demo infrastructure
11 |
12 | struct PlainStyleListViewDemo: View {
13 | var body: some View {
14 | VStack(alignment: .leading) {
15 | Introduction(Text("List that use the `.plain` style: have separators, no inset, and will not be grouped."))
16 | ListStylesBasicListView()
17 | .listStyle(.plain)
18 | }
19 | .navigationTitle("List Style: .plain")
20 | }
21 | }
22 |
23 | struct PlainStyleListView_Previews: PreviewProvider {
24 | static var previews: some View {
25 | NavigationStack {
26 | PlainStyleListViewDemo()
27 | }
28 | }
29 | }
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Chapter 13 - Combine Schedulers and SwiftUI/Schedulers/SwiftUICombineSchedulers/SwiftUICombineSchedulers/Utilities/ButtonStyles.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ButtonStyles.swift
3 | // SwiftUICombineSchedulers
4 | //
5 | // Created by Peter Friese on 14.05.22.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ActionButtonStyle: ButtonStyle {
11 | func makeBody(configuration: Configuration) -> some View {
12 | configuration.label
13 | .padding()
14 | .frame(maxWidth: .infinity)
15 | .controlSize(.large)
16 | .foregroundColor(.white)
17 | .background {
18 | RoundedRectangle(cornerRadius: 8)
19 | .fill(Color(UIColor.systemBlue))
20 | }
21 | .padding()
22 | }
23 | }
24 |
25 | extension ButtonStyle where Self == ActionButtonStyle {
26 | static var action: Self {
27 | return .init()
28 | }
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/Chapter 01 - A New Beginning/Hello SwiftUI/Hello SwiftUI/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // Hello SwiftUI
4 | //
5 | // Created by Peter Friese on 11.09.22.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ContentView: View {
11 | @State var name = ""
12 | var body: some View {
13 | VStack {
14 | Image(systemName: "globe")
15 | .imageScale(.large)
16 | .foregroundColor(.accentColor)
17 | TextField("Enter your name here", text: $name)
18 | .padding(.all)
19 | .border(Color.pink, width: 1)
20 | .padding(.all)
21 | Text("Hello, \(name)!")
22 | .font(.title)
23 | .foregroundColor(Color.pink)
24 | }
25 | .padding()
26 | }
27 | }
28 |
29 | struct ContentView_Previews: PreviewProvider {
30 | static var previews: some View {
31 | ContentView()
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Styling/List Styles/GroupedStyleListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GroupedStyleListView.swift
3 | // ListsExample
4 | //
5 | // Created by Peter Friese on 25.09.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | // MARK: - Demo infrastructure
11 |
12 | struct GroupedStyleListViewDemo: View {
13 | var body: some View {
14 | VStack(alignment: .leading) {
15 | Introduction(Text("List that use the `.grouped` style: have separators, no inset, and are displayed grouped."))
16 | ListStylesBasicListView()
17 | .listStyle(.grouped)
18 | }
19 | .navigationTitle("List Style: .grouped")
20 | }
21 | }
22 |
23 | struct GroupedStyleListView_Previews: PreviewProvider {
24 | static var previews: some View {
25 | NavigationStack {
26 | GroupedStyleListViewDemo()
27 | }
28 | }
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/Chapter 07 - Getting Started with Combine/Getting Stared with Combine Playground.playground/Pages/Introduction.xcplaygroundpage/Contents.swift:
--------------------------------------------------------------------------------
1 | /*:
2 | # Getting Started with Combine
3 |
4 | * Created by [Peter Friese](https://twitter.com/peterfriese) – [peterfriese.dev](https://peterfriese.dev)
5 |
6 | This playground is designed to show how Combine works. It accompanies chapter 8 in "Asynchronous Programming with SwiftUI and Combine"
7 |
8 | ## Overview
9 | * [Simple Publishers](Simple%20Publishers)
10 | * [Pizza Ordering, Part 1](Pizza%20Ordering,%20Part%201)
11 | * [Pizza Ordering, Part 2](Pizza%20Ordering,%20Part%202)
12 | * [Pizza Ordering, Part 3](Pizza%20Ordering,%20Part%203)
13 | * [Manually Assembling Publishers and Subscribers](Manually%20Assembling%20Publishers%20and%20Subscribers)
14 | * [Publishers](Publishers)
15 |
16 | [Next >](@next)
17 | */
18 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/FormsExamples/FormsExamples/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // FormsExamples
4 | //
5 | // Created by Peter Friese on 02.03.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ContentView: View {
11 | var body: some View {
12 | Form {
13 | Text("Asynchronous Programming with SwiftUI and Combine")
14 | .font(.headline).foregroundColor(.red)
15 | Image("book-cover-combine")
16 | Label("Peter Friese", systemImage: "person.crop.rectangle")
17 | Label("451 pages", systemImage: "book")
18 | Toggle("Read", isOn: .constant(true))
19 | Button(action: {}) {
20 | Label("Share", systemImage: "square.and.arrow.up")
21 | }
22 | }
23 | }
24 | }
25 |
26 | struct ContentView_Previews: PreviewProvider {
27 | static var previews: some View {
28 | ContentView()
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Chapter 04 - State Management/StateManagement/StateManagement/Utilities/Introduction.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Introduction.swift
3 | // StateManagement
4 | //
5 | // Created by Peter Friese on 09.02.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct Introduction: View {
11 | var text: Text
12 |
13 | init(_ text: String) {
14 | self.text = Text(text)
15 | }
16 |
17 | init(_ text: Text) {
18 | self.text = text
19 | }
20 |
21 | var body: some View {
22 | text
23 | .font(.subheadline)
24 | .foregroundColor(Color(UIColor.secondaryLabel))
25 | .padding()
26 | }
27 | }
28 |
29 | struct Introduction_Previews: PreviewProvider {
30 | static var previews: some View {
31 | Introduction(
32 | """
33 | This is a multiline string
34 | Just checking ount
35 | """
36 | )
37 | .previewLayout(.sizeThatFits)
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Styling/List Styles/SidebarStyleListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SidebarStyleListView.swift
3 | // ListsExample
4 | //
5 | // Created by Peter Friese on 25.09.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | // MARK: - Demo infrastructure
11 |
12 | struct SidebarStyleListViewDemo: View {
13 | var body: some View {
14 | VStack(alignment: .leading) {
15 | Introduction(Text("List that use the `.sidebar` style: have no separators, no inset and aren't grouped. They can be expanded. "))
16 | ListStylesBasicListView()
17 | .listStyle(.sidebar)
18 | }
19 | .navigationTitle("List Style: .sidebar")
20 | }
21 | }
22 |
23 | struct SidebarStyleListView_Previews: PreviewProvider {
24 | static var previews: some View {
25 | NavigationStack {
26 | SidebarStyleListViewDemo()
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Utilities/Introduction.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Introduction.swift
3 | // StateManagement
4 | //
5 | // Created by Peter Friese on 09.02.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct Introduction: View {
11 | var text: Text
12 |
13 | init(_ text: String) {
14 | self.text = Text(text)
15 | }
16 |
17 | init(_ text: Text) {
18 | self.text = text
19 | }
20 |
21 | var body: some View {
22 | text
23 | .font(.subheadline)
24 | .foregroundColor(Color(UIColor.secondaryLabel))
25 | .padding()
26 | }
27 | }
28 |
29 | struct Introduction_Previews: PreviewProvider {
30 | static var previews: some View {
31 | Introduction(
32 | """
33 | This is a multiline string
34 | Just checking ount
35 | """
36 | )
37 | .previewLayout(.sizeThatFits)
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Styling/List Styles/AutomaticStyleListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AutomaticStyleListView.swift
3 | // ListsExample
4 | //
5 | // Created by Peter Friese on 25.09.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | // MARK: - Demo infrastructure
11 |
12 | struct AutomaticStyleListViewDemo: View {
13 | var body: some View {
14 | VStack(alignment: .leading) {
15 | Introduction(Text("List that use the `.automatic` style: have separators, are inset, and will be displayed grouped"))
16 | ListStylesBasicListView()
17 | .listStyle(.automatic)
18 | }
19 | .navigationTitle("List Style: .automatic")
20 | }
21 | }
22 |
23 | struct AutomaticStyleListView_Previews: PreviewProvider {
24 | static var previews: some View {
25 | NavigationStack {
26 | AutomaticStyleListViewDemo()
27 | }
28 | }
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/Views/BooksListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // BookShelf
4 | //
5 | // Created by Peter Friese on 02/01/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct BooksListView: View {
11 | @ObservedObject var booksViewModel: BooksViewModel
12 |
13 | var body: some View {
14 | List {
15 | ForEach($booksViewModel.books) { $book in
16 | BookRowView(book: $book)
17 | }
18 | .onDelete { indexSet in
19 | booksViewModel.books.remove(atOffsets: indexSet)
20 | }
21 | }
22 | .navigationTitle("Books")
23 | }
24 | }
25 |
26 | struct BooksListView_Previews: PreviewProvider {
27 | static let booksViewModel = BooksViewModel()
28 |
29 | static var previews: some View {
30 | NavigationStack {
31 | BooksListView(booksViewModel: booksViewModel)
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Styling/List Styles/InsetGroupedStyleListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InsetGroupedListView.swift
3 | // ListsExample
4 | //
5 | // Created by Peter Friese on 25.09.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | // MARK: - Demo infrastructure
11 |
12 | struct InsetGroupedStyleListViewDemo: View {
13 | var body: some View {
14 | VStack(alignment: .leading) {
15 | Introduction(Text("List that use the `.insetGrouped` style: have separators, are inset, and are displated grouped."))
16 | ListStylesBasicListView()
17 | .listStyle(.insetGrouped)
18 | }
19 | .navigationTitle("List Style: .insetGrouped")
20 | }
21 | }
22 |
23 | struct InsetGroupedStyleListView_Previews: PreviewProvider {
24 | static var previews: some View {
25 | NavigationStack {
26 | InsetGroupedStyleListViewDemo()
27 | }
28 | }
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "assets" : [
3 | {
4 | "filename" : "App Icon - App Store.imagestack",
5 | "idiom" : "tv",
6 | "role" : "primary-app-icon",
7 | "size" : "1280x768"
8 | },
9 | {
10 | "filename" : "App Icon.imagestack",
11 | "idiom" : "tv",
12 | "role" : "primary-app-icon",
13 | "size" : "400x240"
14 | },
15 | {
16 | "filename" : "Top Shelf Image Wide.imageset",
17 | "idiom" : "tv",
18 | "role" : "top-shelf-image-wide",
19 | "size" : "2320x720"
20 | },
21 | {
22 | "filename" : "Top Shelf Image.imageset",
23 | "idiom" : "tv",
24 | "role" : "top-shelf-image",
25 | "size" : "1920x720"
26 | }
27 | ],
28 | "info" : {
29 | "author" : "xcode",
30 | "version" : 1
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Chapter 04 - State Management/StateManagement/StateManagement/EnvironmentObject/UserProfileScreen.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UserProfileScreen.swift
3 | // StateManagement
4 | //
5 | // Created by Peter Friese on 15.02.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct UserProfileScreen: View {
11 | @EnvironmentObject var profile: UserProfile
12 |
13 | var body: some View {
14 | VStack(alignment: .leading) {
15 | Form {
16 | Section(header: Text("User profile")) {
17 | TextField("Name", text: $profile.name)
18 | TextField("favourite Programming Language", text: $profile.favouriteProgrammingLanguage)
19 | ColorPicker("Favourite color", selection: $profile.favouriteColor)
20 | }
21 | }
22 | }
23 | .navigationTitle("User Profile")
24 | }
25 | }
26 |
27 | struct UserProfileScreen_Previews: PreviewProvider {
28 | static var previews: some View {
29 | UserProfileScreen()
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/SimpleView/SimpleView/SimpleViewApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SimpleViewApp.swift
3 | // SimpleView
4 | //
5 | // Created by Peter Friese on 13.09.22.
6 | //
7 | // Licensed under the Apache License, Version 2.0 (the "License");
8 | // you may not use this file except in compliance with the License.
9 | // You may obtain a copy of the License at
10 | //
11 | // http://www.apache.org/licenses/LICENSE-2.0
12 | //
13 | // Unless required by applicable law or agreed to in writing, software
14 | // distributed under the License is distributed on an "AS IS" BASIS,
15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | // See the License for the specific language governing permissions and
17 | // limitations under the License.
18 |
19 | import SwiftUI
20 |
21 | @main
22 | struct SimpleViewApp: App {
23 | var body: some Scene {
24 | WindowGroup {
25 | ContentView()
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/BookShelfApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BookShelfApp.swift
3 | // BookShelf
4 | //
5 | // Created by Peter Friese on 11.09.22.
6 | //
7 | // Licensed under the Apache License, Version 2.0 (the "License");
8 | // you may not use this file except in compliance with the License.
9 | // You may obtain a copy of the License at
10 | //
11 | // http://www.apache.org/licenses/LICENSE-2.0
12 | //
13 | // Unless required by applicable law or agreed to in writing, software
14 | // distributed under the License is distributed on an "AS IS" BASIS,
15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | // See the License for the specific language governing permissions and
17 | // limitations under the License.
18 |
19 | import SwiftUI
20 |
21 | @main
22 | struct BookShelfApp: App {
23 | var body: some Scene {
24 | WindowGroup {
25 | ContentView()
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchy/ViewHierarchyApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewHierarchyApp.swift
3 | // ViewHierarchy
4 | //
5 | // Created by Peter Friese on 14.09.22.
6 | //
7 | // Licensed under the Apache License, Version 2.0 (the "License");
8 | // you may not use this file except in compliance with the License.
9 | // You may obtain a copy of the License at
10 | //
11 | // http://www.apache.org/licenses/LICENSE-2.0
12 | //
13 | // Unless required by applicable law or agreed to in writing, software
14 | // distributed under the License is distributed on an "AS IS" BASIS,
15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | // See the License for the specific language governing permissions and
17 | // limitations under the License.
18 |
19 | import SwiftUI
20 |
21 | @main
22 | struct ViewHierarchyApp: App {
23 | var body: some Scene {
24 | WindowGroup {
25 | ContentView()
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewModifiers/ViewModifiers/ViewModifiersApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewModifiersApp.swift
3 | // ViewModifiers
4 | //
5 | // Created by Peter Friese on 14.09.22.
6 | //
7 | // Licensed under the Apache License, Version 2.0 (the "License");
8 | // you may not use this file except in compliance with the License.
9 | // You may obtain a copy of the License at
10 | //
11 | // http://www.apache.org/licenses/LICENSE-2.0
12 | //
13 | // Unless required by applicable law or agreed to in writing, software
14 | // distributed under the License is distributed on an "AS IS" BASIS,
15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | // See the License for the specific language governing permissions and
17 | // limitations under the License.
18 |
19 | import SwiftUI
20 |
21 | @main
22 | struct ViewModifiersApp: App {
23 | var body: some Scene {
24 | WindowGroup {
25 | ClosuresDemoView()
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Chapter 01 - A New Beginning/Hello SwiftUI/Hello SwiftUI/Hello_SwiftUIApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Hello_SwiftUIApp.swift
3 | // Hello SwiftUI
4 | //
5 | // Created by Peter Friese on 11.09.22.
6 | //
7 | // Licensed under the Apache License, Version 2.0 (the "License");
8 | // you may not use this file except in compliance with the License.
9 | // You may obtain a copy of the License at
10 | //
11 | // http://www.apache.org/licenses/LICENSE-2.0
12 | //
13 | // Unless required by applicable law or agreed to in writing, software
14 | // distributed under the License is distributed on an "AS IS" BASIS,
15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | // See the License for the specific language governing permissions and
17 | // limitations under the License.
18 |
19 | import SwiftUI
20 |
21 | @main
22 | struct Hello_SwiftUIApp: App {
23 | var body: some Scene {
24 | WindowGroup {
25 | ContentView()
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Chapter 03 - SwiftUI Building Blocks/ViewHierarchy/ViewHierarchyTV/ViewHierarchyTVApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewHierarchyTVApp.swift
3 | // ViewHierarchyTV
4 | //
5 | // Created by Peter Friese on 14.09.22.
6 | //
7 | // Licensed under the Apache License, Version 2.0 (the "License");
8 | // you may not use this file except in compliance with the License.
9 | // You may obtain a copy of the License at
10 | //
11 | // http://www.apache.org/licenses/LICENSE-2.0
12 | //
13 | // Unless required by applicable law or agreed to in writing, software
14 | // distributed under the License is distributed on an "AS IS" BASIS,
15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | // See the License for the specific language governing permissions and
17 | // limitations under the License.
18 |
19 | import SwiftUI
20 |
21 | @main
22 | struct ViewHierarchyTVApp: App {
23 | var body: some Scene {
24 | WindowGroup {
25 | ContentView()
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Chapter 05 - Displaying Data in Lists/ListsExample/ListsExample/Static Lists/StaticListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // ListsExample
4 | //
5 | // Created by Peter Friese on 30.06.21.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct StaticListView: View {
11 | var body: some View {
12 | List {
13 | Text("Hello, world!")
14 | Text("Hello, SwiftUI!")
15 | }
16 | }
17 | }
18 |
19 | // MARK: - Demo infrastructure
20 |
21 | struct StaticListViewDemo: View {
22 | var body: some View {
23 | VStack(alignment: .leading) {
24 | Introduction("You can place other views inside a List.")
25 | StaticListView()
26 | }
27 | .listStyle(.insetGrouped) // to get back the original look and feel
28 | .navigationTitle("List with simple row")
29 | }
30 | }
31 |
32 | struct StaticListViewDemo_Previews: PreviewProvider {
33 | static var previews: some View {
34 | NavigationStack {
35 | StaticListViewDemo()
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/deprecated/Server/server/docker-compose.yml:
--------------------------------------------------------------------------------
1 | # Docker Compose file for Vapor
2 | #
3 | # Install Docker on your system to run and test
4 | # your Vapor app in a production-like environment.
5 | #
6 | # Note: This file is intended for testing and does not
7 | # implement best practices for a production deployment.
8 | #
9 | # Learn more: https://docs.docker.com/compose/reference/
10 | #
11 | # Build images: docker-compose build
12 | # Start app: docker-compose up app
13 | # Stop all: docker-compose down
14 | #
15 | version: '3.7'
16 |
17 | x-shared_environment: &shared_environment
18 | LOG_LEVEL: ${LOG_LEVEL:-debug}
19 |
20 | services:
21 | app:
22 | image: server:latest
23 | build:
24 | context: .
25 | environment:
26 | <<: *shared_environment
27 | ports:
28 | - '8080:8080'
29 | # user: '0' # uncomment to run as root for testing purposes even though Dockerfile defines 'vapor' user.
30 | command: ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"]
31 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/final/BookShelf/BookShelf/BookShelfApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BookShelfApp.swift
3 | // BookShelf
4 | //
5 | // Created by Peter Friese on 11.09.22.
6 | //
7 | // Licensed under the Apache License, Version 2.0 (the "License");
8 | // you may not use this file except in compliance with the License.
9 | // You may obtain a copy of the License at
10 | //
11 | // http://www.apache.org/licenses/LICENSE-2.0
12 | //
13 | // Unless required by applicable law or agreed to in writing, software
14 | // distributed under the License is distributed on an "AS IS" BASIS,
15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | // See the License for the specific language governing permissions and
17 | // limitations under the License.
18 |
19 | import SwiftUI
20 |
21 | @main
22 | struct BookShelfApp: App {
23 | var body: some Scene {
24 | WindowGroup {
25 | // BooksListView(books: Book.sampleBooks)
26 | ContentView(books: Book.sampleBooks)
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Chapter 06 - Building Input Forms/BookShelf/BookShelf/App/BookShelfApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BookShelfApp.swift
3 | // BookShelf
4 | //
5 | // Created by Peter Friese on 02/01/2021.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct BookShelfApp: App {
12 | // By pulling up the source of truth to the app, we make sure that all the app's
13 | // windows share the same source of truth. In case each BooksListView had their own
14 | // @StateObject var booksViewModel = BooksViewModel(), any changes made to any of
15 | // them wouldn't be reflected on the other ones.
16 | // See this in action by running the app on an iPad and then use multi-tasking to arrange
17 | // two app windows side-by-side.
18 | @StateObject var booksViewModel = BooksViewModel()
19 |
20 | var body: some Scene {
21 | WindowGroup {
22 | NavigationSplitView {
23 | BooksListView(booksViewModel: booksViewModel)
24 | .navigationTitle("Books")
25 | } detail: {
26 | Text("Select a book")
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Chapter 09 - Networking with Combine/server/docker-compose.yml:
--------------------------------------------------------------------------------
1 | # Docker Compose file for Vapor
2 | #
3 | # Install Docker on your system to run and test
4 | # your Vapor app in a production-like environment.
5 | #
6 | # Note: This file is intended for testing and does not
7 | # implement best practices for a production deployment.
8 | #
9 | # Learn more: https://docs.docker.com/compose/reference/
10 | #
11 | # Build images: docker-compose build
12 | # Start app: docker-compose up app
13 | # Stop all: docker-compose down
14 | #
15 | version: '3.7'
16 |
17 | x-shared_environment: &shared_environment
18 | LOG_LEVEL: ${LOG_LEVEL:-debug}
19 |
20 | services:
21 | app:
22 | image: server:latest
23 | build:
24 | context: .
25 | environment:
26 | <<: *shared_environment
27 | ports:
28 | - '8080:8080'
29 | # user: '0' # uncomment to run as root for testing purposes even though Dockerfile defines 'vapor' user.
30 | command: ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"]
31 |
--------------------------------------------------------------------------------
/Chapter 10 - Error Handling in Combine/server/docker-compose.yml:
--------------------------------------------------------------------------------
1 | # Docker Compose file for Vapor
2 | #
3 | # Install Docker on your system to run and test
4 | # your Vapor app in a production-like environment.
5 | #
6 | # Note: This file is intended for testing and does not
7 | # implement best practices for a production deployment.
8 | #
9 | # Learn more: https://docs.docker.com/compose/reference/
10 | #
11 | # Build images: docker-compose build
12 | # Start app: docker-compose up app
13 | # Stop all: docker-compose down
14 | #
15 | version: '3.7'
16 |
17 | x-shared_environment: &shared_environment
18 | LOG_LEVEL: ${LOG_LEVEL:-debug}
19 |
20 | services:
21 | app:
22 | image: server:latest
23 | build:
24 | context: .
25 | environment:
26 | <<: *shared_environment
27 | ports:
28 | - '8080:8080'
29 | # user: '0' # uncomment to run as root for testing purposes even though Dockerfile defines 'vapor' user.
30 | command: ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"]
31 |
--------------------------------------------------------------------------------
/Chapter 02 - Getting Started with SwiftUI/starter/BookShelf/BookShelf/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // BookShelf
4 | //
5 | // Created by Peter Friese on 11.09.22.
6 | //
7 | // Licensed under the Apache License, Version 2.0 (the "License");
8 | // you may not use this file except in compliance with the License.
9 | // You may obtain a copy of the License at
10 | //
11 | // http://www.apache.org/licenses/LICENSE-2.0
12 | //
13 | // Unless required by applicable law or agreed to in writing, software
14 | // distributed under the License is distributed on an "AS IS" BASIS,
15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | // See the License for the specific language governing permissions and
17 | // limitations under the License.
18 |
19 | import SwiftUI
20 |
21 | struct ContentView: View {
22 | var body: some View {
23 | Text("Hello, World!")
24 | }
25 | }
26 |
27 | struct ContentView_Previews: PreviewProvider {
28 | static var previews: some View {
29 | ContentView()
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Chapter 11 - Implementing Custom Combine Operators/server/docker-compose.yml:
--------------------------------------------------------------------------------
1 | # Docker Compose file for Vapor
2 | #
3 | # Install Docker on your system to run and test
4 | # your Vapor app in a production-like environment.
5 | #
6 | # Note: This file is intended for testing and does not
7 | # implement best practices for a production deployment.
8 | #
9 | # Learn more: https://docs.docker.com/compose/reference/
10 | #
11 | # Build images: docker-compose build
12 | # Start app: docker-compose up app
13 | # Stop all: docker-compose down
14 | #
15 | version: '3.7'
16 |
17 | x-shared_environment: &shared_environment
18 | LOG_LEVEL: ${LOG_LEVEL:-debug}
19 |
20 | services:
21 | app:
22 | image: server:latest
23 | build:
24 | context: .
25 | environment:
26 | <<: *shared_environment
27 | ports:
28 | - '8080:8080'
29 | # user: '0' # uncomment to run as root for testing purposes even though Dockerfile defines 'vapor' user.
30 | command: ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"]
31 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help me improve the code samples for the book
4 | title: ''
5 | labels: ''
6 | assignees: peterfriese
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------