├── 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 | ![](PlaygroundsApp.png) 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 | ![](Running.png) -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------