100% found this document useful (1 vote)
32 views

Asynchronous Programming with SwiftUI and Combine 1st Edition Peter Friese - The full ebook version is ready for instant download

The document promotes the ebook 'Asynchronous Programming with SwiftUI and Combine' by Peter Friese, available for download at ebookmass.com. It includes links to additional recommended books on related programming topics. The content covers various aspects of SwiftUI and Combine, including state management, building UIs, and networking.

Uploaded by

makkealfage
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
32 views

Asynchronous Programming with SwiftUI and Combine 1st Edition Peter Friese - The full ebook version is ready for instant download

The document promotes the ebook 'Asynchronous Programming with SwiftUI and Combine' by Peter Friese, available for download at ebookmass.com. It includes links to additional recommended books on related programming topics. The content covers various aspects of SwiftUI and Combine, including state management, building UIs, and networking.

Uploaded by

makkealfage
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 53

Visit ebookmass.

com to download the full version and


explore more ebook or textbook

Asynchronous Programming with SwiftUI and Combine


1st Edition Peter Friese

_____ Click the link below to download _____


https://ebookmass.com/product/asynchronous-programming-with-
swiftui-and-combine-1st-edition-peter-friese/

Explore and download more ebook or textbook at ebookmass.com


Here are some recommended products that we believe you will be
interested in. You can click the link to download.

Asynchronous Programming with SwiftUI and Combine:


Functional Programming to Build UIs on Apple Platforms 1st
Edition Peter Friese
https://ebookmass.com/product/asynchronous-programming-with-swiftui-
and-combine-functional-programming-to-build-uis-on-apple-
platforms-1st-edition-peter-friese/

Asynchronous Programming in Rust 1st Edition Carl Fredrik


Samson

https://ebookmass.com/product/asynchronous-programming-in-rust-1st-
edition-carl-fredrik-samson/

Build Mobile Apps with SwiftUI and Firebase: Learn SwiftUI


and Firebase by Building Real-World Applications
Communicating with a Backend 1st Edition Sullivan De Carli
https://ebookmass.com/product/build-mobile-apps-with-swiftui-and-
firebase-learn-swiftui-and-firebase-by-building-real-world-
applications-communicating-with-a-backend-1st-edition-sullivan-de-
carli/

Pro iPhone Development with SwiftUI: Design and Manage Top


Quality Apps (4th Edition) Wallace Wang

https://ebookmass.com/product/pro-iphone-development-with-swiftui-
design-and-manage-top-quality-apps-4th-edition-wallace-wang/
Readings from Programming with C++ 1st Edition Kyla
Mcmullen

https://ebookmass.com/product/readings-from-programming-with-c-1st-
edition-kyla-mcmullen/

Readings from Programming with C++ 1st Edition Kyla


Mcmullen

https://ebookmass.com/product/readings-from-programming-with-c-1st-
edition-kyla-mcmullen-2/

Beginning iPhone Development with SwiftUI: Exploring the


iOS SDK (7th Edition) Wallace Wang

https://ebookmass.com/product/beginning-iphone-development-with-
swiftui-exploring-the-ios-sdk-7th-edition-wallace-wang/

R Programming for Actuarial Science Peter Mcquire

https://ebookmass.com/product/r-programming-for-actuarial-science-
peter-mcquire/

Kubernetes Programming with Go: Programming Kubernetes


Clients and Operators Using Go and the Kubernetes API 1st
Edition Philippe Martin
https://ebookmass.com/product/kubernetes-programming-with-go-
programming-kubernetes-clients-and-operators-using-go-and-the-
kubernetes-api-1st-edition-philippe-martin/
Asynchronous
Programming with
SwiftUI and Combine
Functional Programming to
Build UIs on Apple Platforms

Peter Friese
Asynchronous Programming with SwiftUI and Combine: Functional
Programming to Build UIs on Apple Platforms
Peter Friese
Hamburg, Germany

ISBN-13 (pbk): 978-1-4842-8571-8 ISBN-13 (electronic): 978-1-4842-8572-5


https://doi.org/10.1007/978-1-4842-8572-5

Copyright © 2023 by Peter Friese


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or
part of the material is concerned, specifically the rights of translation, reprinting, reuse of
illustrations, recitation, broadcasting, reproduction on microfilms or in any other physical way,
and transmission or information storage and retrieval, electronic adaptation, computer software,
or by similar or dissimilar methodology now known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark
symbol with every occurrence of a trademarked name, logo, or image we use the names, logos,
and images only in an editorial fashion and to the benefit of the trademark owner, with no
intention of infringement of the trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if
they are not identified as such, is not to be taken as an expression of opinion as to whether or not
they are subject to proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of
publication, neither the authors nor the editors nor the publisher can accept any legal
responsibility for any errors or omissions that may be made. The publisher makes no warranty,
express or implied, with respect to the material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Susan McDermott
Development Editor: James Markham
Coordinating Editor: Jessica Vakili
Distributed to the book trade worldwide by Springer Science+Business Media New York, 1 NY
Plaza, New York, NY 10004. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@
springer-sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and
the sole member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc).
SSBM Finance Inc is a Delaware corporation.
For information on translations, please e-mail [email protected]; for
reprint, paperback, or audio rights, please e-mail [email protected].
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook
versions and licenses are also available for most titles. For more information, reference our Print
and eBook Bulk Sales web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is
available to readers on the Github repository: https://github.com/Apress/Asynchronous-
Programming-with-SwiftUI-and-Combine. For more detailed information, please visit
http://www.apress.com/source-code.
Printed on acid-free paper
For Anne
Table of Contents
About the Author��������������������������������������������������������������������������������xv

Foreword������������������������������������������������������������������������������������������xvii

Preface����������������������������������������������������������������������������������������������xix

Acknowledgments�����������������������������������������������������������������������������xxi

About This Book������������������������������������������������������������������������������xxiii

Part 1�������������������������������������������������������������������������������������������1
Chapter 1: SwiftUI: A New Beginning���������������������������������������������������3
Why a New UI Framework?�����������������������������������������������������������������������������������5
SwiftUI Principles��������������������������������������������������������������������������������������������������7
Declarative vs. Imperative�������������������������������������������������������������������������������7
State Management������������������������������������������������������������������������������������������8
Composition over Inheritance��������������������������������������������������������������������������9
Everything Is a View—Except That It Isn’t�����������������������������������������������������10
UIs Are a Function of Their State�������������������������������������������������������������������10
A Quick Tour of SwiftUI����������������������������������������������������������������������������������������11
Prerequisites�������������������������������������������������������������������������������������������������11
Creating a New SwiftUI App��������������������������������������������������������������������������11
Adding Some Interaction to Your App������������������������������������������������������������19

v
Table of Contents

Using SwiftUI’s State Management to Keep UI and Model in Sync���������������25


Exercises�������������������������������������������������������������������������������������������������������������31
Summary������������������������������������������������������������������������������������������������������������31

Chapter 2: Getting Started with SwiftUI���������������������������������������������33


What We’re Going to Build�����������������������������������������������������������������������������������34
Composing a View for Displaying a Book������������������������������������������������������������36
Build the View with Static Data���������������������������������������������������������������������������40
Using the Preview to Make Sure Our View Works As Intended���������������������������51
Displaying a List of Books�����������������������������������������������������������������������������������53
Setting Up Data Binding��������������������������������������������������������������������������������������56
Adjusting the Preview Canvas�����������������������������������������������������������������������������59
Making the Code Reusable���������������������������������������������������������������������������������60
Refactoring the Code Using Extract Subview������������������������������������������������60
Renaming ContentView���������������������������������������������������������������������������������64
Keep Complexity in Check�����������������������������������������������������������������������������65
Views and View Modifiers�����������������������������������������������������������������������������������65
Exercises�������������������������������������������������������������������������������������������������������������66
Tips and Tricks����������������������������������������������������������������������������������������������������66
Summary������������������������������������������������������������������������������������������������������������67

Chapter 3: SwiftUI Building Blocks�����������������������������������������������������69


Views������������������������������������������������������������������������������������������������������������������70
User Interface Views��������������������������������������������������������������������������������������74
Container Views���������������������������������������������������������������������������������������������78
Layout Behavior���������������������������������������������������������������������������������������������79
Views Are Just Descriptions of the UI������������������������������������������������������������80
View Modifiers����������������������������������������������������������������������������������������������������83
Configuring Views������������������������������������������������������������������������������������������84

vi
Table of Contents

Applying View Modifiers to Child Views���������������������������������������������������������87


Using View Modifiers to Register Action Handlers�����������������������������������������89
Summary������������������������������������������������������������������������������������������������������������92

Chapter 4: State Management������������������������������������������������������������93


Managing State in SwiftUI����������������������������������������������������������������������������������94
Binding Value Types��������������������������������������������������������������������������������������������95
Binding Objects���������������������������������������������������������������������������������������������������98
ObservableObject������������������������������������������������������������������������������������������������99
@StateObject������������������������������������������������������������������������������������������������������99
When to Use������������������������������������������������������������������������������������������������101
@ObservedObject���������������������������������������������������������������������������������������������101
When to Use������������������������������������������������������������������������������������������������103
@EnvironmentObject����������������������������������������������������������������������������������������103
When to Use������������������������������������������������������������������������������������������������106
Summary����������������������������������������������������������������������������������������������������������106

Chapter 5: Displaying Data in Lists���������������������������������������������������107


Getting Started with Lists in SwiftUI�����������������������������������������������������������������107
Using Other SwiftUI Views Inside List Rows������������������������������������������������109
Building Custom List Rows��������������������������������������������������������������������������111
More Complex List Rows�����������������������������������������������������������������������������114
Dynamic Lists����������������������������������������������������������������������������������������������������117
Displaying a List of Elements����������������������������������������������������������������������117
Using List Bindings to Allow Modifying List Items���������������������������������������121
Asynchronously Fetching Data��������������������������������������������������������������������123
Pull-to-Refresh��������������������������������������������������������������������������������������������126
Searching����������������������������������������������������������������������������������������������������130

vii
Table of Contents

Styling���������������������������������������������������������������������������������������������������������������134
List Styles����������������������������������������������������������������������������������������������������135
Headers and Footers�����������������������������������������������������������������������������������137
List Cells������������������������������������������������������������������������������������������������������139
Separators���������������������������������������������������������������������������������������������������140
Actions��������������������������������������������������������������������������������������������������������������143
Swipe-to-Delete������������������������������������������������������������������������������������������144
Moving and Deleting Items Using EditMode������������������������������������������������145
Swipe Actions����������������������������������������������������������������������������������������������147
Managing Focus in Lists�����������������������������������������������������������������������������������154
How to Manage Focus in SwiftUI�����������������������������������������������������������������154
How to Manage Focus in Lists���������������������������������������������������������������������156
Handling the Enter Key��������������������������������������������������������������������������������158
What About MVVM?�������������������������������������������������������������������������������������159
Eliminating Empty Elements������������������������������������������������������������������������163
Summary����������������������������������������������������������������������������������������������������������165

Chapter 6: Building Input Forms�������������������������������������������������������167


Building Simple Forms��������������������������������������������������������������������������������������168
Showing Data in a Form������������������������������������������������������������������������������������179
Make It Editable������������������������������������������������������������������������������������������������182
Drill-Down Navigation���������������������������������������������������������������������������������������184
Input Validation�������������������������������������������������������������������������������������������������191
Using .onChange(of:)�����������������������������������������������������������������������������������192
Using a View Model to Handle Form Validation�������������������������������������������193
Synchronizing a Local Source of Truth with the Global Source of
Truth by Using @Binding and @ObservableObject��������������������������������������196
Using Combine to Perform Form Validation�������������������������������������������������202
Summary����������������������������������������������������������������������������������������������������������204

viii
Table of Contents

Part 2���������������������������������������������������������������������������������������205
Chapter 7: Getting Started with Combine�����������������������������������������207
What Is Functional Reactive Programming?�����������������������������������������������������207
Publishers���������������������������������������������������������������������������������������������������������209
Subscribers�������������������������������������������������������������������������������������������������������211
Operators����������������������������������������������������������������������������������������������������������213
Composing Operators���������������������������������������������������������������������������������������215
Combining Publishers���������������������������������������������������������������������������������������220
Summary����������������������������������������������������������������������������������������������������������223

Chapter 8: Driving UI State with Combine����������������������������������������225


Input Validation Using Combine������������������������������������������������������������������������226
The Sign-Up Form View�������������������������������������������������������������������������������227
The View Model�������������������������������������������������������������������������������������������229
Validating the Username�����������������������������������������������������������������������������232
Displaying Validation Messages������������������������������������������������������������������234
Encapsulating Combine Pipelines in Computed Properties�������������������������236
Validating the Password������������������������������������������������������������������������������238
Putting It All Together����������������������������������������������������������������������������������241
Exercises�����������������������������������������������������������������������������������������������������������243
Summary����������������������������������������������������������������������������������������������������������244

Chapter 9: Networking with Combine�����������������������������������������������247


Fetching Data Using URLSession����������������������������������������������������������������������248
Using Combine to Fetch Data����������������������������������������������������������������������������252
Destructuring Tuples Using Key Paths���������������������������������������������������������254
Mapping Data����������������������������������������������������������������������������������������������254
Fetching Data Using Combine, Simplified����������������������������������������������������255

ix
Table of Contents

Connecting to the UI������������������������������������������������������������������������������������������256


Handling Multithreading������������������������������������������������������������������������������������262
Optimizing Network Access������������������������������������������������������������������������������263
Finding the Root Cause�������������������������������������������������������������������������������264
Using the share Operator to Share a Publisher�������������������������������������������266
Using debounce to Further Optimize the UX������������������������������������������������269
Using removeDuplicates to Avoid Sending the Same Request Twice����������270
Bringing It All Together��������������������������������������������������������������������������������������271
Exercises�����������������������������������������������������������������������������������������������������������273
Summary����������������������������������������������������������������������������������������������������������274

Chapter 10: Error Handling in Combine��������������������������������������������275


Error Handling Strategies����������������������������������������������������������������������������������276
Ignoring the Error����������������������������������������������������������������������������������������276
Retrying (with Exponential Backoff)������������������������������������������������������������276
Showing an Error Message�������������������������������������������������������������������������277
Replacing the Entire View with an Error View���������������������������������������������277
Showing an Inline Error Message����������������������������������������������������������������278
Typical Error Conditions and How to Handle Them�������������������������������������������278
Implementing a Fallible Network API�����������������������������������������������������������279
Calling the API and Handling Errors�������������������������������������������������������������282
Handling Device/Network Offline Errors������������������������������������������������������286
Handling Validation Errors���������������������������������������������������������������������������289
Handling Response Parsing Errors��������������������������������������������������������������293
Handling Internal Server Errors�������������������������������������������������������������������298
Summary����������������������������������������������������������������������������������������������������������305

x
Visit https://ebookmass.com today to explore
a vast collection of ebooks across various
genres, available in popular formats like
PDF, EPUB, and MOBI, fully compatible with
all devices. Enjoy a seamless reading
experience and effortlessly download high-
quality materials in just a few simple steps.
Plus, don’t miss out on exciting offers that
let you access a wealth of knowledge at the
best prices!
Table of Contents

Chapter 11: Implementing Custom Combine Operators�������������������307


What Is a Combine Operator?���������������������������������������������������������������������������307
Implementing Custom Operators����������������������������������������������������������������������309
Implementing a Retry Operator with a Delay����������������������������������������������������311
Conditionally Retrying���������������������������������������������������������������������������������������313
Implementing a Retry Operator for Exponential Backoff�����������������������������������314
Summary����������������������������������������������������������������������������������������������������������316

Chapter 12: Wrapping Existing APIs in Combine������������������������������317


A Case Study�����������������������������������������������������������������������������������������������������317
Using Combine to Access Firestore������������������������������������������������������������������321
Using View Models and Published Properties���������������������������������������������322
Using Combine to Wrap APIs�����������������������������������������������������������������������325
Creating Your Own Publishers���������������������������������������������������������������������������327
Using PassthroughSubject to Wrap Snapshot Listeners������������������������������328
Using Future to Implement One-Time Fetching from Firestore�������������������332
Summary����������������������������������������������������������������������������������������������������������335

Chapter 13: Combine Schedulers and SwiftUI����������������������������������337


What Is a Scheduler������������������������������������������������������������������������������������������338
Types of Schedulers������������������������������������������������������������������������������������������340
Default Behavior�����������������������������������������������������������������������������������������������341
Switching Schedulers���������������������������������������������������������������������������������������344
Controlling Upstream Publishers Using subscribe(on:)�������������������������������346
Controlling Downstream Subscribers Using receive(on:)����������������������������349
Other Operators That Influence Scheduling�������������������������������������������������351
Performing Asynchronous Work������������������������������������������������������������������������353

xi
Table of Contents

Integrating with Other APIs�������������������������������������������������������������������������������354


URLSession��������������������������������������������������������������������������������������������������355
Firebase�������������������������������������������������������������������������������������������������������356
Summary����������������������������������������������������������������������������������������������������������358

Part 3���������������������������������������������������������������������������������������361
Chapter 14: Getting Started with async/await���������������������������������363
Synchronous Programming with Functions������������������������������������������������������367
Asynchronous Programming with Closures������������������������������������������������������371
Asynchronous Programming with async/await������������������������������������������������377
Defining and Calling Asynchronous Functions��������������������������������������������377
Calling Asynchronous Functions in Parallel�������������������������������������������������381
Summary����������������������������������������������������������������������������������������������������������383

Chapter 15: Using async/await in SwiftUI����������������������������������������385


Fetching Data Asynchronously Using URLSession��������������������������������������������386
Calling Asynchronous Code�������������������������������������������������������������������������������387
The Task View Modifier�������������������������������������������������������������������������������������388
Calling Asynchronous Code When the User Taps a Button��������������������������������390
Using Pull-to-Refresh to Update Views Asynchronously�����������������������������������390
Searchable Views and async/await������������������������������������������������������������������391
Updating the UI from the Main Thread��������������������������������������������������������������394
Summary����������������������������������������������������������������������������������������������������������402

Chapter 16: Bringing It All Together: SwiftUI, async/await, and


Combine������������������������������������������������������������������������405
Fetching Data Using Combine���������������������������������������������������������������������������406
Fetching Data Using async/await����������������������������������������������������������������������407
Is This the End of Combine?������������������������������������������������������������������������������409

xii
Table of Contents

Connecting the UI…������������������������������������������������������������������������������������������410


…to a Combine Pipeline�����������������������������������������������������������������������������������410
…to an async/await Method����������������������������������������������������������������������������413
Calling Asynchronous Code from Combine�������������������������������������������������������415
Summary����������������������������������������������������������������������������������������������������������420

Index�������������������������������������������������������������������������������������������������423

xiii
About the Author
Peter Friese is a software engineer with over
30 years of experience in building software for
a wide range of platforms—from Windows,
J2EE, the Web, Android, to iOS and the Mac. He
works as a Senior Developer Advocate on the
Firebase team at Google, where he is in charge
of making sure iOS developer have a great
experience using the Firebase SDK on iOS and
Apple’s other platforms.
Peter writes about SwiftUI, Swift, and Firebase development on his
blog, peterfriese.dev, and can be found on Twitter as @peterfriese.

xv
Foreword
I’ve been developing iOS apps for a while and started learning SwiftUI
almost as soon as it was released back in 2019. I remember that I couldn’t
wait to start using it because it just seemed so much more intuitive for me
than UIKit.
There wasn’t much SwiftUI documentation at first and those of us who
jumped straight in had to figure out a lot of things for ourselves. So I started
sharing what I learned while building apps with SwiftUI on a blog.
Just a few months later, the SwiftUI team at Apple reached out to me to
join them in working on the framework. It was an invaluable experience
and it gave me a great perspective on the inner workings of SwiftUI and
the decisions behind the APIs. Sure, SwiftUI is not perfect and still needs
time to mature, but it’s already making many developers happier and more
excited about building apps for Apple platforms. A lot of thought goes into
making SwiftUI APIs as simple and as streamlined as they are, so that we
can get the right behavior for the platform by default.
I left Apple in April 2022 and joined Nil Coalescing as a cofounder and
a software engineer. Though I’m a little sad that I don’t get to contribute
to the SwiftUI framework directly anymore, I’m really happy that I’m
now able to use the APIs I helped to develop and to share my SwiftUI
knowledge with other iOS developers.
Seeing how much Apple is betting on SwiftUI by introducing new
frameworks that require using it like WidgetKit and Swift Charts, I believe
it has a great potential. It’s also nice to see how many more developers are
starting to use SwiftUI and how much more great SwiftUI-related content is
now available both from Apple and from the community.

xvii
Foreword

I believe that Asynchronous Programming with SwiftUI and Combine


is a valuable addition to your book collection if you are going to work with
SwiftUI. I like its unique focus on calling asynchronous APIs from SwiftUI
applications, since it’s usually a major part of a real-world project. And
Peter Friese is certainly the right person to talk about it given his work as a
Developer Advocate for Firebase where he gets to experiment a lot with the
Firebase asynchronous APIs and teach how to use them with SwiftUI. This
book is full of practical examples using both Combine and Swift async/
await APIs and will serve as a great foundation for developing SwiftUI apps
with networking or local asynchronous data processing.
Natalia Panferova
Author of Integrating SwiftUI into UIKit Apps
and Founder of Nil Coalescing (https://nilcoalescing.com/about/)

xviii
Preface
I started developing for iPhone OS (as it was called back then) in 2009.
I had just upgraded from an iPhone 3 to an iPhone 3GS, and I was
super excited to kick the tires and build my first app—using Xcode and
Objective-C!
I already had practice using a variety of other IDEs, languages,
and operating systems: starting out with GW-BASIC on MS-DOS, to
Visual Basic and Delphi on Windows, to Java with Jbuilder, Websphere
Application Developer, and Eclipse (for building J2EE and Spring
applications for enterprise customers).
But using Xcode and Objective-C was a bit of a shock. All the other
IDEs that I’d used before were a lot more powerful (e.g., they all offered
refactoring support), and Objective-C with all its square brackets looked a
bit strange to me.
Looking back at all the years of building software, Delphi was one of
the most productive environments I’ve used to build software. It combined
a mature, object-oriented language (Object Pascal) and a powerful IDE
that allowed developers to quickly put together UIs for Windows apps.
Plus, the tagline “Rapid Application Development” certainly had a
ring to it.
But Xcode and Objective-C were the future, so I buckled up and
continued my journey to learn how to use them.
Fast forward ten years—I had just watched WWDC 2019 and was
thrilled by SwiftUI and its ease of use. Building UIs with SwiftUI felt so
snappy, and reminded me of Delphi in many ways. I started thinking about
how amazing it would be to combine SwiftUI with a framework that makes
building backend systems easier.

xix
Preface

When the Firebase team at Google was looking for a person to join
their Developer Relations team to specifically focus on the iOS developer
ecosystem, I realized the opportunity this meant for me: bring together
a language I love (Swift), a UI toolkit that enables developers to quickly
build great-looking UIs (SwiftUI), and an SDK that makes developers more
efficient by removing the need to run and operate your own backend
system (Firebase). With all these tools, I could help people build better
apps, faster.
On day one after joining the Firebase DevRel team as a Developer
Advocate, I started building demos to showcase the features of the Firebase
iOS SDK. And I quickly learned that writing demos using SwiftUI was so
much easier than using UIKit. This ease of use meant that I could focus on
what I actually wanted to teach: how to use the Firebase SDK and its APIs.
SwiftUI’s declarative approach to building UIs is a lot more
opinionated about how your code should be structured when building UIs
programmatically, making it a lot easier for other developers to understand
what your code is supposed to do.
And thanks to using a state management model that is based on
functional reactive programming, SwiftUI and Combine make it a lot easier
to build UIs that are in sync with the underlying data model and other
parts of your app all of the time. I’m pretty sure we all know of apps for
which this is not the case and can attest to the terrible UX this means.
The goal of this book is to introduce you to building applications with
SwiftUI, Combine, and async/await. I also aim to provide some guidance
that helps you architect apps that reap the benefits of using declarative
and functional reactive approaches for building UI-heavy applications that
interface with asynchronous backend systems, such as Firebase.
Thanks for buying this book! I hope it turns out to be useful for you,
and I would love to hear from you. You can tweet me (I am @peterfriese on
Twitter), or leave a comment on the GitHub repo1 of this book.

1
https://github.com/peterfriese/SwiftUI-Combine-Book/issues

xx
Acknowledgments
Writing a book is a cross-functional effort, and the result of contributions
from many different people, and this book is no different.
First and foremost, I must thank Todd Kerpelman for believing in me
and giving me the opportunity to join the Firebase Developer Relations
team and become the resident iOS expert.
Additionally, I’d like to thank the many people who provided feedback,
encouragement, guidance, and technical expertise for the topics covered
in this book, including Heiko Behrens, Paul Beusterien, Bas Broek,
Marina Coelho, David East, Rosário Fernandes, Todd Kerpelman, Shai
Mishali, Rachel Myers, Laurence Moroney, Natalia Panferova, Donny
Wals, and Ryan Wilson. The conversations with you were invaluable input
to this book and helped inform my thinking about SwiftUI, Combine,
asynchronous programming, and how to present these topics in a
written form.
This book simply wouldn’t have been possible without the various
teams at Apress/Springer who guided me through the process and helped
shape this book into what it is now. I am particularly grateful to Aaron
Schwarz for convincing me to write this book in the first place, Clement
Wilson for helping me stay on track, and Jessica Vakili for shaping the
content into great teaching material.
I also owe a huge debt of gratitude to all the reviewers who provided
feedback along the way, including Tunde Adegoroye, Paul Beusterien,
Marcus Ficner, Adam Fordyce, Dominik Hauser, Rachel Saunders,
Florian Schweizer, and Ryan Wilson. They did an amazing job at finding
inconsistencies, typos, grammatical issues, and coding errors that the
compiler didn’t spot. Any remaining errors and mistakes are entirely mine.

xxi
Acknowledgments

If you spot any, I would be grateful if you filed an issue1 on this book’s
GitHub repository, so I can fix them for any future editions.
Finally, my deepest thanks go to my wife Anne and my sons Sören,
Lennart, and Jonas. You endured the time I put into creating this book and
its companion code, and my focus when writing it. Your encouragement
and company is what kept me going—I couldn’t have done this
without you!

1
https://github.com/peterfriese/Asynchronous-Programming-with-
SwiftUI-and-Combine/issues

xxii
Visit https://ebookmass.com today to explore
a vast collection of ebooks across various
genres, available in popular formats like
PDF, EPUB, and MOBI, fully compatible with
all devices. Enjoy a seamless reading
experience and effortlessly download high-
quality materials in just a few simple steps.
Plus, don’t miss out on exciting offers that
let you access a wealth of knowledge at the
best prices!
Other documents randomly have
different content
In der folgenden Woche wurde der Tote begraben, der Sohn ging
dicht hinter dem Sarge her und konnte nun den guten Vater nicht
mehr zu sehen bekommen, der ihn so sehr geliebt hatte. Er hörte,
wie sie die Erde auf den Sarg hinunterwarfen und sah noch die letzte
Ecke desselben, aber nach der nächsten Schaufel Erde, welche
hinabgeworfen wurde, war auch die verschwunden, da war es, als
wolle sein Herz in Stücke zerspringen, so betrübt war er. Ringsherum
sangen sie einen Psalm; es waren schöne, heilige Klänge, und die
Tränen traten dem Johannes in die Augen, er weinte, und das tat
ihm in seiner Trauer wohl. Die Sonne beschien herrlich die grünen
Bäume, als wolle sie sagen: „Du darfst nicht mehr betrübt sein,
Johannes! Siehst du, wie schön der Himmel ist? Dort oben ist nun
dein Vater und bittet den lieben Gott, daß es dir allezeit wohl
ergehen möge!“
„Ich will auch immer gut sein,“ sagte Johannes, „dann komme ich
in den Himmel zu meinem Vater, und was wird das für eine Freude
werden, wenn wir einander wiedersehen! Wieviel werde ich ihm
dann nicht erzählen können, und er wird mir so viele Dinge zeigen,
mir die Herrlichkeit des Himmels erklären, ebenso wie er mich hier
auf Erden unterrichtete. Oh, was für eine Freude wird das werden!“
Er dachte sich das so deutlich, daß er dabei lächelte, während die
Tränen ihm noch über die Wangen liefen. Die kleinen Vögel saßen
oben in den Kastanienbäumen und zwitscherten: „Quivit, Quivit!“ Sie
waren froh und munter, obgleich sie mit bei dem Begräbnisse
gewesen: aber sie wußten wohl, daß der tote Mann nun im Himmel
wäre, Flügel hätte, schöner und größer als die ihrigen, daß er nun
glücklich sei, weil er hier auf Erden gut gewesen, und darüber waren
sie vergnügt. Johannes sah, wie sie von den grünen Bäumen weit in
die Welt hinausflogen, da bekam er auch Lust, mitzufliegen. Aber
zuerst schnitt er ein großes Holzkreuz, um es auf seines Vaters Grab
zu setzen, und als er es am Abend dahin brachte, war das Grab mit
Sand und Blumen geschmückt, das hatten fremde Leute getan, denn
sie hielten alle viel von dem lieben Vater, der nun tot war.
Früh am nächsten Morgen packte Johannes sein kleines Bündel
zusammen und verwahrte in seinem Gürtel sein ganzes Erbteil,
welches fünfzig Taler und ein paar Silberschillinge betrug, damit
wollte er in die Welt hinaus wandern. Aber zuerst ging er nach dem
Kirchhofe zu seines Vaters Grabe, betete ein Vaterunser und sagte:
„Lebe wohl!“
Draußen auf dem Felde, wo er ging, standen alle Blumen frisch
und schön in dem warmen Sonnenscheine, sie nickten im Winde, als
wollten sie sagen: „Willkommen im Grünen! Ist es hier nicht schön?“
Aber Johannes wendete sich noch einmal zurück, um die alte Kirche
zu betrachten, in der er als ein kleines Kind getauft und wo er jeden
Sonntag mit seinem Vater zum Gottesdienst gewesen war und
seinen Psalm gesungen hatte; da sah er hoch oben in einer der
Öffnungen des Turmes den Kirchenkobold mit seiner kleinen, roten,
spitzen Mütze stehen, wie er sein Gesicht mit dem gebogenen Arme
beschattete, da ihm sonst die Sonne in die Augen schien. Johannes
nickte ihm Lebewohl zu, und der kleine Kobold schwenkte seine rote
Mütze, legte die Hand auf das Herz und warf ihm viele Kußhändchen
zu, um zu zeigen, wie gut er es mit ihm meine, und daß er ihm eine
recht glückliche Reise wünsche.

Johannes dachte daran, wie viel Schönes er nun in der großen,


prächtigen Welt zu sehen bekommen würde und ging weiter und
weiter fort, so weit wie er früher nie gewesen war. Er kannte die
Orte nicht, durch die er kam, oder die Menschen, denen er
begegnete. — Nun war er weit draußen in der Fremde.
Die erste Nacht mußte er sich auf einem Heuschober auf dem
Felde schlafen legen, ein anderes Bett hatte er nicht. Aber das war
recht hübsch, meinte er, der König könnte es nicht besser haben.
Das ganze Feld mit dem Bache, der Heuschober und dann der blaue
Himmel darüber, das war gewiß eine schöne Schlafkammer. Das
grüne Gras mit den kleinen, roten und weißen Blumen war die
Fußdecke, die Fliederbüsche und die wilden Rosenhecken waren
Blumensträuße, und zum Waschbecken diente ihm der ganze Bach
mit dem klaren, frischen Wasser, wo das Schilf sich neigte und ihm
guten Abend und guten Morgen bot. Der Mond war wahrhaft eine
große Nachtlampe, hoch oben unter der blauen Decke, und der
zündete die Gardinen nicht an mit seinem Feuer, Johannes konnte
ruhig schlafen, und er tat es auch und erwachte erst wieder, als die
Sonne aufging und alle die kleinen Vögel rings umher sangen:
„Guten Morgen! Guten Morgen! Bist du noch nicht auf?“
Die Glocken läuteten zur Kirche! es war Sonntag. Die Leute gingen
hin, den Prediger zu hören, und Johannes folgte ihnen, sang einen
Psalm und hörte Gottes Wort. Es war ihm, als wäre er in seiner
eigenen Kirche, in der er getauft worden war, und wo er Psalmen mit
seinem Vater gesungen hatte.

Draußen auf dem Kirchhofe waren viele Gräber und auf einigen
wuchs hohes Gras. Da dachte er an seines Vaters Grab, welches am
Ende auch so aussehen würde wie diese, da er es nicht jäten und
schmücken konnte. Er setzte sich also nieder und riß das Gras ab,
richtete die Holzkreuze auf, welche umgefallen waren und legte die
Kränze, die der Wind vom Grabe fortgerissen hatte, wieder auf ihre
Stelle, indem er dachte: vielleicht tut jemand dasselbe an meines
Vaters Grabe, da ich es nicht tun kann!
Draußen vor der Kirchhofstüre stand ein alter Bettler und stützte
sich auf seine Krücke. Johannes gab ihm die Silberschillinge, die er
hatte, und ging dann glücklich und vergnügt weiter fort in die weite
Welt hinein.

Gegen Abend war ein schrecklich böses Wetter, er sputete sich,


unter Dach und Fach zu gelangen, aber es wurde bald finstere
Nacht, da erreichte er endlich eine kleine Kirche, die einsam auf
einem kleinen Hügel lag.
„Hier will ich mich in einen Winkel setzen!“ sagte er und ging
hinein. „Ich bin ermüdet und habe es wohl nötig, ein wenig
auszuruhen.“ Dann setzte er sich nieder, faltete seine Hände und
betete sein Abendgebet, und ehe er es wußte, schlief und träumte
er, während es draußen blitzte und donnerte.
Als er wieder erwachte, war es Mitternacht, das böse Wetter war
vorübergezogen und der Mond schien durch die Fenster zu ihm
herein. Mitten in der Kirche stand ein offener Sarg mit einem toten
Manne darin, weil er noch nicht begraben war. Johannes war
durchaus nicht furchtsam, denn er hatte ein gutes Gewissen, und er
wußte wohl, daß die Toten niemandem etwas zuleide tun. Die
Lebenden, die Übles tun, sind böse Menschen. Solche zwei lebende,
schlimme Leute standen dicht bei dem toten Manne, der hier in der
Kirche beigesetzt war, bevor er beerdigt wurde, ihm wollten sie Übles
erweisen, ihn nicht in seinem Sarge liegen lassen, sondern ihn vor
die Kirchtüre hinauswerfen, den armen, toten Mann!
„Weshalb wollt ihr das tun?“ fragte Johannes. „Das ist böse und
schlimm, laßt ihn in Jesu Namen ruhen!“
„Oh, Schnickschnack!“ sagten die beiden häßlichen Menschen. „Er
hat uns angeführt! Er schuldet uns Geld: das konnte er nicht
bezahlen, und nun ist er obendrein tot, nun bekommen wir vollends
keinen Pfennig! Deshalb wollen wir uns rächen: er soll wie ein Hund
draußen vor der Kirchtür liegen!“
„Ich habe nicht mehr als fünfzig Taler!“ sagte Johannes. „Das ist
mein ganzes Erbteil, aber das will ich euch gern geben, wenn ihr mir
ehrlich versprechen wollt, den armen, toten Mann in Ruhe zu lassen.
Ich werde schon durchkommen ohne das Geld, ich habe gesunde,
starke Gliedmaßen, und der liebe Gott wird mir allezeit helfen!“
„Ja,“ sagten die häßlichen Menschen, „wenn du seine Schuld
bezahlen willst, wollen wir beide ihm nichts tun, darauf kannst du
dich verlassen!“ Alsdann nahmen sie das Geld, welches er ihnen gab,
lachten laut auf über seine Gutmütigkeit und gingen ihres Weges. Er
aber legte die Leiche wieder im Sarge zurecht und faltete ihre
Hände, nahm Abschied von ihr und ging durch den großen Wald
zufrieden weiter.
Rings umher, wo der Mond durch die Bäume herein schien, sah er
die niedlichen, kleinen Elfen lustig spielen. Sie ließen sich nicht
stören: sie wußten wohl, daß er ein guter, unschuldiger Mensch sei,
und es sind nur die bösen Leute, welche die Elfen nicht zu sehen
bekommen. Einige von ihnen waren nicht größer, als ein Finger breit
ist und hatten ihr langes, gelbes Haar mit Goldkämmen aufgesteckt;
je zwei schaukelten sie sich auf den großen Tautropfen, die auf den
Blättern und dem hohen Grase lagen, zuweilen entrollte der Tropfen,
dann fielen sie nieder zwischen den langen Grashalmen, und das
verursachte ein Gelächter und Lärmen unter den andern Kleinen. Es
war allerliebst! Sie sangen, und Johannes erkannte deutlich die
hübschen Lieder, die er als kleiner Knabe gelernt hatte. Große, bunte
Spinnen mit Silberkronen auf dem Kopfe mußten von der einen
Hecke zur andern lange Hängebrücken und Paläste spinnen, welche,
da der feine Tau darauf fiel, wie schimmerndes Glas im Mondscheine
aussahen. So währte es fort, bis die Sonne aufging. Die kleinen Elfen
krochen dann in die Blumenknospen, und der Wind erfaßte ihre
Brücken und Schlösser, die als Spinngewebe durch die Luft flogen.
Johannes war eben aus dem Walde herausgekommen, als eine
starke Mannesstimme hinter ihm rief: „Holla, Kamerad, wohin geht
die Reise?“
„In die weite Welt hinaus!“ sagte er. „Ich habe weder Vater noch
Mutter, bin ein armer Bursche, aber der Herr hilft mir wohl.“
„Ich will auch in die weite Welt hinaus,“ sagte der fremde Mann.
„Wollen wir beide einander Gesellschaft leisten?“
„Jawohl,“ sagte er, und so gingen sie miteinander. Bald gewannen
sie sich recht lieb, denn sie waren beide gute Menschen. Aber
Johannes merkte wohl, daß der Fremde viel klüger war als er. Der
hatte fast die ganze Welt durchreist und wußte von allem Möglichen,
was existierte, zu erzählen.
Die Sonne stand schon hoch, als sie sich unter einen großen Baum
setzten, ihr Frühstück zu genießen, zur selben Zeit kam eine alte
Frau. Die war sehr alt und ging krumm einher, sie stützte sich auf
einen Krückstock, auf ihrem Rücken trug sie ein Bündel Brennholz,
welches sie sich im Walde gesammelt hatte. Ihre Schürze war
aufgebunden, und Johannes sah, daß drei große Ruten von
Farnkraut und Weidenreisern daraus hervorsahen. Als sie ihnen nahe
war, glitt sie mit dem einen Fuße aus, fiel und tat einen lauten
Schrei, denn sie hatte das Bein gebrochen, die arme, alte Frau!
Johannes meinte sogleich, daß sie die alte Frau nach Hause tragen
wollten, wo sie wohnte, aber der Fremde machte sein Ränzel auf,
nahm eine Büchse hervor und sagte, daß er hier eine Salbe habe,
welche sogleich ihr Bein wieder gesund und kräftig machen würde,
so daß sie selbst nach Hause gehen könne, und zwar, als ob sie nie
das Bein gebrochen hätte. Allein dafür verlange er auch, daß sie ihm
die drei Ruten schenke, die sie in ihrer Schürze habe.

„Das wäre gut bezahlt!“ sagte die Alte und nickte ganz eigen mit
dem Kopfe. Sie wollte die Ruten nicht gern hergeben, aber es war
auch nicht angenehm, mit gebrochenem Beine dazuliegen. So gab
sie ihm denn die Ruten, und sowie er nur die Salbe auf das Bein
gerieben hatte, erhob sich auch die alte Mutter und ging viel besser
denn zuvor. Solches konnte die Salbe bewirken. Aber die war auch
nicht in der Apotheke zu haben.
„Was willst du mit den Ruten?“ fragte Johannes nun seinen
Reisekameraden.
„Das sind drei schöne Kräuterbesen,“ sagte der, „die liebe ich sehr,
denn ich bin ein närrischer Patron!“
Dann gingen sie noch ein gutes Stück.
„Sieh, wie der Himmel sich umzieht,“ sagte Johannes und zeigte
geradeaus. „Das sind schrecklich dicke Wolken!“
„Nein,“ sagte der Reisekamerad, „das sind keine Wolken, das sind
Berge — die herrlichen großen Berge, wo man hinauf über die
Wolken und in die frische Luft gelangt! Glaube mir, da ist es herrlich!
Morgen sind wir sicher weit in der Welt.“
Das war aber nicht so nahe, wie es aussah, sie hatten einen
ganzen Tag zu gehen, bevor sie die Berge erreichten, wo die
schwarzen Wälder gegen den Himmel aufwuchsen und wo es Steine
gab, fast so groß als eine große Stadt. Das mochte wahrlich eine
schwere Anstrengung werden, da hinüberzukommen, aber darum
gingen auch Johannes und sein Reisekamerad in das Wirtshaus
hinein, um sich gut auszuruhen und Kräfte zum morgenden Marsche
zu sammeln.
Unten in der großen Schenkstube im Wirtshause waren viele
Menschen versammelt, denn dort war ein Mann, der gab
Puppenkomödie. Er hatte soeben sein kleines Theater aufgestellt,
und die Leute saßen ringsumher, um die Komödie zu sehen. Aber
vorn hatte ein dicker Schlächter Platz genommen, und zwar den
allerbesten; sein großer Bullenbeißer — der sah sehr bissig aus! —
saß an seiner Seite und machte große Augen, so, wie alle andern.
Nun begann die Komödie, und das war eine niedliche Komödie mit
einem Könige und einer Königin, die saßen auf dem schönsten
Throne, hatten goldene Kronen auf dem Haupte und lange
Schleppen an den Kleidern, denn ihre Mittel erlaubten das. Die
niedlichsten Holzpuppen mit Glasaugen und großen Schnurrbärten
standen an allen Türen und machten auf und zu, damit frische Luft
in das Zimmer kommen konnte. Es war eine recht niedliche
Komödie. Aber als die Königin aufstand und über den Fußboden
hinging, machte der große Bullenbeißer — Gott mag wissen, was er
sich dachte — da der dicke Schlächter ihn nicht hielt, einen Sprung
stracks hinein in das Theater und packte die Königin mitten um ihre
Taille, daß es knackte. Es war schrecklich!
Der arme Mann, der die Komödie gab, war sehr erschrocken und
betrübt über seine Königin! Denn es war die allerniedlichste Puppe,
die er hatte, und nun hatte der häßliche Bullenbeißer den Kopf
abgebissen. Aber als die Leute später fortgingen, sagte der Fremde,
der mit Johannes gekommen war, daß er sie schon wieder zurecht
machen würde, und dann nahm er seine Büchse hervor und
schmierte die Puppe mit der Salbe, womit er der alten Frau
geholfen, als sie das Bein gebrochen hatte. Sowie die Puppe
geschmiert worden, war sie wieder ganz, ja sie konnte sogar alle
ihre Glieder selbst bewegen, man brauchte nicht mehr an der Schnur
zu ziehen. Die Puppe war wie ein lebendiger Mensch, nur daß sie
nicht sprechen konnte. Der Mann, der das kleine Puppentheater
hatte, war sehr froh, nun brauchte er diese Puppe nicht mehr zu
halten, die konnte ja von selbst tanzen. Das konnte keine der
andern.
Als es später Nacht wurde und alle Leute im Wirtshause zu Bett
gegangen waren, war jemand da, der so schrecklich tief seufzte und
solange damit fortfuhr, daß alle aufstanden, um zu sehen, wer es
wäre. Der Mann, der die Komödie gegeben hatte, ging nach seinem
kleinen Theater hin, denn dort war es, wo jemand seufzte. Alle
Holzpuppen lagen untereinander: der König und alle Trabanten, und
die waren es, die so jämmerlich seufzten und mit ihren Glasaugen
stierten, denn sie wollten so gern wie die Königin ein wenig
geschmiert werden, damit sie sich auch von selbst bewegen
könnten. Die Königin legte sich sofort auf die Knie und streckte ihre
prächtige Krone in die Höhe, während sie bat: „Nimm mir diese,
aber schmiere meinen Gemahl und meine Hofleute!“ Da konnte der
arme Mann, der das Theater und die Puppen besaß, nicht
unterlassen zu weinen, denn es tat ihm wirklich ihretwegen leid. Er
versprach sogleich dem Reisekameraden, ihm alles Geld zu geben,
was er am nächsten Abend für seine Komödie erhalten würde, wenn
er nur vier bis fünf von seinen niedlichen Puppen schmieren wolle.
Aber der Reisekamerad sagte, daß er durchaus nichts weiter
verlange, als den Säbel, den jener an seiner Seite habe, und als er
den erhielt, beschmierte er sechs Puppen, die sogleich tanzten und
zwar so niedlich, daß alle die lebenden Menschenmädchen, die es
sahen, alsbald mittanzten. Der Kutscher und die Köchin tanzten, der
Diener und das Stubenmädchen, alle die Fremden und die
Feuerschaufel und die Feuerzange, aber die fielen um, als sie die
ersten Sprünge machten. — Ja, das war eine lustige Nacht!

Am nächsten Morgen ging Johannes mit seinem Reisekameraden


von ihnen fort auf die hohen Berge hinauf und durch die großen
Tannenwälder. Sie kamen so hoch hinauf, daß die Kirchtürme tief
unter ihnen zuletzt wie kleine blaue Beeren unten in all dem Grünen
aussahen, sie konnten sehr weit sehen, viele, viele Meilen weit, wo
sie nie gewesen waren! Soviel Schönes der prächtigen Welt hatte
Johannes früher nie auf einmal gesehen! Die Sonne schien warm aus
der frischen blauen Luft, er hörte auch zwischen den Bergen die
Jäger das Waldhorn so schön und lieblich blasen, daß ihm vor
Freude die Tränen in die Augen traten und er nicht unterlassen
konnte, auszurufen: „Du guter, lieber Gott! Ich möchte dich küssen,
weil du so gut gegen uns alle bist und uns all die Herrlichkeit, die in
der Welt ist, gegeben hast!“
Der Reisekamerad stand auch mit gefalteten Händen da und sah
über den Wald und die Städte in den warmen Sonnenschein hinaus.
Zu gleicher Zeit ertönte es wunderbar lieblich über ihrem Haupte, sie
blickten in die Höhe, ein weißer großer Schwan schwebte in der Luft
und sang, wie sie früher nie einen Vogel hatten singen hören! Aber
der Gesang wurde schwächer und schwächer, er neigte seinen Kopf
und sank langsam zu ihren Füßen nieder, wo er tot liegen blieb, der
schöne Vogel!
„Zwei herrliche Flügel,“ sagte der Reisekamerad, „so weiß und
groß wie die, welche der Vogel hat, sind Geldes wert: die will ich mit
mir nehmen! Siehst du nun wohl, daß es gut war, daß ich einen
Säbel bekam?“ Und so hieb er mit einem Schlage beide Flügel des
toten Schwanes ab: die wollte er behalten.
Sie reisten nun viele, viele Meilen weit fort über die Berge, bis sie
zuletzt eine große Stadt vor sich sahen, mit Hunderten von Türmen,
die wie Silber in der Sonne glänzten. In der Stadt war ein prächtiges
Marmorschloß, mit purem Golde gedeckt. Hier wohnte der König.
Johannes und der Reisekamerad wollten nicht sogleich in die Stadt
gehen, sondern blieben im Wirtshause vor der Stadt, damit sie sich
putzen konnten, denn sie wollten nett aussehen, wenn sie auf die
Straße kämen. Der Wirt erzählte ihnen, daß der König ein sehr guter
Mann sei, der nie einem Menschen etwas zuleide täte, aber seine
Tochter, ja, Gott behüte uns! die sei eine schlimme Prinzessin.
Schönheit besaß sie genug, keine konnte so hübsch und niedlich
sein, wie sie war, aber was half das? Sie war eine böse Hexe, die
Schuld daran hatte, daß viele herrliche Prinzen ihr Leben hatten
verlieren müssen. — Allen Menschen hatte sie die Erlaubnis erteilt,
um sie freien zu dürfen. Ein jeder konnte kommen, er mochte Prinz
oder Bettler sein: das sei ihr gleich. Er sollte nur drei Sachen raten,
an die sie gerade gedacht hätte und um die sie ihn befragte. Konnte
er das, so wollte sie sich mit ihm vermählen, und er sollte König
über das ganze Land sein, wenn ihr Vater stürbe; konnte er aber die
drei Sachen nicht raten, so ließ sie ihn aufhängen oder ihm den Kopf
abhauen! Ihr Vater, der alte König, war sehr betrübt darüber, aber er
konnte ihr nicht verbieten, so böse zu sein, denn er hatte einmal
gesagt, er wolle nie etwas mit ihren Liebhabern zu tun haben, sie
könne selbst tun, was sie wolle. Jedesmal wenn ein Prinz kam und
raten sollte, um die Prinzessin zu erhalten, konnte er es nicht, und
dann wurde er gehängt oder geköpft. Er war ja beizeiten gewarnt, er
hätte das Freien unterlassen können. Der König war so betrübt über
all die Trauer und das Elend, daß er einen ganzen Tag des Jahres mit
allen seinen Soldaten auf den Knien lag und betete, die Prinzessin
möge gut werden, aber das wollte sie durchaus nicht. Die alten
Frauen, die Branntwein tranken, färbten denselben schwarz, bevor
sie ihn tranken, so trauerten sie. Und mehr konnten sie doch nicht
tun!
„Die häßliche Prinzessin!“ sagte Johannes. „Sie sollte wirklich die
Rute bekommen, das würde ihr gut tun. Wäre ich nur der alte König,
sie sollte schon gegerbt werden!“
Da hörten sie das Volk draußen Hurra rufen. Die Prinzessin kam
vorbei, sie war wirklich schön, daß alle Leute vergaßen, wie böse sie
war, deshalb riefen sie Hurra. Zwölf schöne Jungfrauen, alle in
weißseidenen Kleidern und jede eine goldene Tulpe in der Hand,
ritten auf schwarzen Pferden ihr zur Seite. Die Prinzessin selbst hatte
ein weißes Pferd mit Diamanten und Rubinen geschmückt. Ihr
Reitkleid war aus purem Goldstoff, und die Peitsche, die sie in der
Hand hatte, sah aus, als wäre sie ein Sonnenstrahl. Die goldene
Kette auf dem Haupte war wie kleine Sterne vom Himmel, und der
Mantel war aus mehr als tausend Schmetterlingsflügeln
zusammengenäht. Dessenungeachtet war sie noch schöner als ihre
Kleider.
Als Johannes sie zu sehen bekam, wurde er so rot im Gesichte wie
ein Blutstropfen und konnte kaum ein einzelnes Wort sagen.
Die Prinzessin sah so aus wie das schöne Mädchen mit der
goldenen Krone, von der er in der Nacht geträumt hatte, als sein
Vater gestorben war. Er fand sie so schön, daß er nicht unterlassen
konnte, sie recht zu lieben. Das wäre gewiß nicht wahr, daß sie eine
böse Hexe sei, welche die Leute hängen oder köpfen ließ, wenn sie
nicht raten könnten, was sie von ihnen verlangte. „Ein jeder hat die
Erlaubnis, um sie zu freien, sogar der ärmste Bettler. Ich will wirklich
nach dem Schlosse gehen, denn ich kann es nicht unterlassen!“ Sie
sagten ihm alle, er möge es nicht tun, es würde ihm bestimmt wie
all den andern ergehen. Der Reisekamerad riet auch davon ab, aber
Johannes meinte, es würde schon gehen. Er bürstete seine Schuhe
und seinen Rock, wusch sich Gesicht und Hände, kämmte sein
hübsches blondes Haar und ging dann allein in die Stadt hinein und
nach dem Schlosse.
„Herein!“ sagte der alte König, als Johannes an die Türe pochte.
Johannes öffnete, und der König im Schlafrock und in gestickten
Pantoffeln kam ihm entgegen, die Krone hatte er auf dem Haupte,
das Zepter in der einen Hand und den Reichsapfel in der andern.
„Warte ein bißchen!“ sagte er, und nahm den Apfel unter den Arm,
um Johannes die Hand reichen zu können. Aber sowie er erfuhr, er
sei ein Freier, fing er so an zu weinen, daß das Zepter sowohl wie
der Apfel auf den Fußboden fielen und er die Augen mit seinem
Schlafrocke trocknen mußte. Der arme, alte König!
„Laß es sein!“ sagte er. „Es geht Dir schlecht, wie all den andern.
Nun, Du wirst es sehen!“ Dann führte er ihn hinaus nach dem
Lustgarten der Prinzessin. Da sah es schrecklich aus! Oben in jedem
Baume hingen drei, vier Königssöhne, die um die Prinzessin gefreit
hatten, aber die Sachen, die sie ihnen aufgegeben, nicht hatten
raten können. Jedesmal, wenn es wehte, klapperten alle Gerippe, so
daß die kleinen Vögel erschraken und nie in den Garten zu kommen
wagten. Alle Blumen waren an Menschenknochen aufgebunden, und
in Blumentöpfen standen Totenköpfe und grinsten. Das war wirklich
ein sonderbarer Garten für eine Prinzessin.
„Hier siehst Du es!“ sagte der alte König. „Es wird Dir ebenso wie
diesen hier ergehen. Laß es deshalb lieber. Du machst mich wirklich
unglücklich, denn ich nehme mir das sehr zu Herzen!“
Johannes küßte dem guten, alten König die Hand und sagte, es
würde schon gehen, denn er sei entzückt von der schönen
Prinzessin.
Da kam die Prinzessin selbst mit allen ihren Damen in den
Schloßhof geritten, sie gingen deshalb zu ihr hinaus und sagten ihr
guten Tag. Sie war wunderschön anzuschauen und reichte Johannes
die Hand. Und er hielt noch viel mehr von ihr wie früher. Sie konnte
sicher keine böse Hexe sein, wie alle Leute es ihr nachsagten. —
Dann begaben sie sich in den Saal, und die kleinen Pagen
präsentierten ihnen Eingemachtes und Pfeffernüsse. Aber der alte
König war betrübt, er konnte nichts essen. Und die Pfeffernüsse
waren ihm auch zu hart.
Es wurde bestimmt, daß Johannes am nächsten Morgen wieder
nach dem Schlosse kommen sollte, dann würden die Richter und der
ganze Rat versammelt sein und hören, wie es mit dem Raten gehe.
Würde er gut dabei fahren, so sollte er dann noch zweimal kommen,
aber es war noch nie jemand da gewesen, der das erstemal richtig
geraten hätte, und dann mußte er das Leben verlieren.
Johannes war nicht bekümmert darum, wie es ihm ergehen
würde. Er war vielmehr vergnügt, gedachte nur der schönen
Prinzessin und glaubte sicher, der liebe Gott werde ihm schon helfen.
Aber wie, dies wußte er nicht und wollte lieber nicht daran denken.
Er tanzte auf der Landstraße dahin, als er nach dem Wirtshause
zurückging, wo der Reisekamerad auf ihn wartete.
Johannes konnte nicht fertig damit werden, zu erzählen, wie artig
die Prinzessin gegen ihn gewesen und wie schön sie sei. Er sehne
sich schon sehr nach dem nächsten Tage, wo er in das Schloß sollte,
um sein Glück im Raten zu versuchen.
Aber der Reisekamerad schüttelte den Kopf und war betrübt. „Ich
bin dir so gut!“ sagte er. „Wir hätten noch lange beisammen sein
können, und nun soll ich dich schon verlieren! Du armer, lieber
Johannes! Ich möchte weinen, aber ich will am letzten Abende, den
wir vielleicht beisammen sind, deine Freude nicht stören. Wir wollen
lustig sein, recht lustig! Morgen, wenn du fort bist, kann ich
ungestört weinen.“
Alle Leute drinnen in der Stadt hatten sogleich erfahren, daß ein
neuer Freier der Prinzessin angekommen war, und deshalb herrschte
große Betrübnis. Das Schauspielhaus blieb geschlossen, alle
Kuchenfrauen banden Flor um ihre Zuckermänner, der König und die
Priester lagen auf den Knien in den Kirchen. Es war große Betrübnis,
denn es konnte Johannes ja nicht besser ergehen, als es allen
übrigen Freiern ergangen war.
Gegen Abend bereitete der Reisekamerad eine große Bowle
Punsch und sagte zu Johannes: „Nun wollen wir recht lustig sein und
auf der Prinzessin Gesundheit trinken.“ Als aber Johannes zwei
Gläser getrunken hatte, wurde er so schläfrig, daß es ihm unmöglich
war, die Augen offen zu halten, er sank in tiefen Schlaf. Der
Reisekamerad hob ihn sanft vom Stuhle und legte ihn in das Bett
hinein, und als es dunkle Nacht wurde, nahm er die beiden großen
Flügel, die er von dem Schwane abgehauen hatte, und band sie an
seine Schultern fest. Die größte Rute, die er von der alten Frau
erhalten, welche gefallen war und das Bein gebrochen hatte, steckte
er in seine Tasche, öffnete das Fenster und flog so über die Stadt,
nach dem Schlosse hin, wo er sich in einen Winkel unter das Fenster
setzte, wo es in die Schlafstube der Prinzessin ging.
Es war still in der ganzen Stadt. Nun schlug die Uhr dreiviertel auf
Zwölf, das Fenster ging auf und die Prinzessin flog in einem langen,
weißen Mantel und mit schwarzen Flügeln über die Stadt weg hinaus
zu einem großen Berge. Aber der Reisekamerad machte sich
unsichtbar, so daß sie ihn nicht sehen konnte, flog hinterher und
peitschte die Prinzessin mit seiner Rute, so daß Blut kam, wohin er
schlug. Ach, das war eine Fahrt durch die Luft! Der Wind erfaßte
ihren Mantel, der sich nach allen Seiten ausbreitete gleich einem
großen Schiffssegel, und der Mond schien durch denselben.

„Wie es hagelt! wie es hagelt!“ sagte die Prinzessin bei jedem


Schlage, den sie von der Rute bekam, und das war ihr schon recht.
Endlich kam sie hinaus zum Berge und klopfte an. Es rollte gleich
dem Donner, indem der Berg sich öffnete, sie ging hinein. Der
Reisekamerad folgte ihr, denn niemand konnte ihn sehen, er war
unsichtbar. Sie gingen durch einen großen, langen Gang, wo die
Wände eigentümlich glänzten, es waren über tausend glühende
Spinnen, die an der Mauer auf- und abliefen und wie Feuer
leuchteten. Da kamen sie in einen großen Saal, von Silber und Gold
erbaut, Blumen so groß wie Sonnenblumen, rote und blaue, glänzten
an den Wänden, aber niemand konnte die Blumen pflücken, denn
die Stengel waren häßliche, giftige Schlangen, und die Blumen
waren Feuer, welches ihnen aus dem Rachen heraus brannte. Die
ganze Decke war mit leuchtenden Johanneswürmchen und
himmelblauen Fledermäusen bedeckt, die mit den dünnen Flügeln
schlugen. Es sah ganz schauerlich aus! Mitten auf dem Fußboden
war ein Thron, der von vier Pferdegerippen getragen wurde, welchen
Zaumzeug von den roten Feuerspinnen aufgelegt war, der Thron
selbst war aus milchweißem Glase, und die Kissen waren kleine,
schwarze Mäuse, die einander in den Schwanz bissen. Über
demselben war ein Dach von rosenrotem Spinngewebe, mit den
niedlichen, kleinen grünen Flügeln besetzt, welche wie Edelsteine
glänzten. Auf dem Throne saß ein alter Zauberer, mit einer Krone auf
dem häßlichen Kopfe und einem Zepter in der Hand. Er küßte die
Prinzessin auf die Stirn, ließ sie an seine Seite auf den kostbaren
Thron setzen, und dann begann die Musik. Große, schwarze
Heuschrecken bliesen auf Mundharmonikas, und die Ente schlug sich
auf den Leib, denn sie hatte keine Trommel. Das war ein
possierliches Konzert. Kleine, schwarze Kobolde mit einem Irrlichte
auf der Mütze tanzten im Saale herum. Niemand aber konnte den
Reisekameraden erblicken, er hatte sich hinter den Thron gestellt
und hörte und sah alles. Die Hofleute, die nun herein kamen, waren
sehr fein und vornehm! Der, welcher sehen konnte, merkte wohl, wie
es damit zusammenhing. Sie waren nichts weiter als Besenstiele mit
Kohlköpfen darauf, in die der Zauberer Leben gehext und denen er
gestickte Kleider gegeben hatte. Aber das machte nichts aus, sie
wurden doch nur zum Prunk gebraucht.
Nachdem erst etwas getanzt war, erzählte die Prinzessin dem
Zauberer, daß sie einen neuen Freier erhalten habe und fragte
deshalb, woran sie wohl denken sollte, um ihn am nächsten Morgen
darnach zu fragen, wenn er nach dem Schlosse käme.
„Höre,“ sagte der Zauberer, „das will ich dir sagen! Du mußt etwas
recht Leichtes wählen, denn dann fällt er gar nicht darauf. Denke an
einen deiner Schuhe. Das rät er nicht. Laß ihm den Kopf abhauen,
doch vergiß nicht, wenn du morgen Nacht wieder zu mir kommst,
mir seine Augen mitzubringen, denn die will ich essen!“
Die Prinzessin verneigte sich tief und sagte, sie würde die Augen
nicht vergessen. Der Zauberer öffnete nun den Berg, und sie flog
wieder zurück, aber der Reisekamerad folgte ihr und prügelte sie
wieder so stark mit der Rute, daß sie tief über das starke
Hagelwetter seufzte und sich, so sehr sie konnte, beeilte, durch das
Fenster in ihre Schlafstube zu gelangen. Der Reisekamerad dagegen
flog zum Wirtshause zurück, wo Johannes noch schlief, löste seine
Flügel ab und legte sich dann auch auf das Bett, denn er konnte
wohl müde sein.
Es war früh am Morgen, als Johannes erwachte. Der
Reisekamerad stand auch auf und erzählte, daß er diese Nacht einen
sonderbaren Traum von der Prinzessin und ihrem Schuhe gehabt
habe und bat ihn, deshalb doch zu fragen, ob die Prinzessin nicht an
ihren Schuh gedacht haben sollte. Denn das war es ja, was er von
dem Zauberer im Berge gehört hatte.
„Ich kann ebensogut darnach als nach etwas anderem fragen,“
sagte Johannes. „Vielleicht ist das richtig, was du geträumt hast,
denn ich vertraue auf den lieben Gott, der mir schon helfen wird.
Aber ich will dir noch Lebewohl sagen, denn rate ich falsch, so
bekomme ich dich nie mehr zu sehen.“
Dann küßten sie sich, und Johannes ging in die Stadt und nach
dem Schlosse. Der Saal war mit Menschen angefüllt, die Richter
saßen in ihren Lehnstühlen und hatten Eiderdunenkissen unter den
Köpfen, denn sie hatten gar viel zu denken. Der alte König stand auf
und trocknete seine Augen mit einem weißen Taschentuche. Nun trat
die Prinzessin herein. Sie war noch schöner wie gestern und grüßte
alle in anmutigster Weise, aber dem Johannes gab sie die Hand und
sagte: „Guten Morgen, du!“
Nun sollte Johannes raten, woran sie gedacht habe, Gott, wie sah
sie ihn freundlich an! Aber sowie sie ihn das eine Wort „Schuh“
aussprechen hörte, wurde sie kreideweiß im Gesicht und zitterte am
ganzen Körper. Allein das konnte ihr nichts helfen, denn er hatte
richtig geraten!
Der Tausend! wie wurde der alte König vergnügt, er schoß einen
Purzelbaum, daß es eine Lust war. Und alle Leute klatschten in die
Hände, ihm und Johannes zu Ehren, der das erstemal richtig geraten
hatte.
Der Reisekamerad war auch erfreut, als er erfuhr, wie gut es
abgelaufen war. Aber Johannes faltete die Hände und dankte seinem
Gotte, der sicher die beiden andern Male wieder helfen würde. Am
nächsten Tage sollte schon wieder geraten werden.
Der Abend verging ebenso wie der gestrige. Als Johannes schlief,
flog der Reisekamerad hinter der Prinzessin her zum Berge hinaus
und prügelte sie noch stärker als das vorige Mal, denn nun hatte er
zwei Ruten genommen. Niemand bekam ihn zu sehen, und er hörte
alles. Die Prinzessin wollte an ihren Handschuh denken, und das
erzählte er wieder dem Johannes, als ob es ein Traum sei. Daher
konnte derselbe richtig raten, und es verursachte eine große Freude
auf dem Schlosse. Der ganze Hof schoß Purzelbäume, sowie sie es
den König das erstemal hatten machen sehen. Aber die Prinzessin
lag auf dem Sofa und wollte nicht ein einziges Wort sagen. Nun kam
es darauf an, ob Johannes das drittemal richtig raten konnte.
Glückte es, so sollte er ja die schöne Prinzessin haben und nach dem
Tode des alten Königs das ganze Reich erben. Riet er falsch, so sollte
er sein Leben verlieren und der Zauberer seine schönen, blauen
Augen essen.
Den Abend vorher ging Johannes zeitig zu Bett, betete sein
Abendgebet und schlief dann ruhig. Aber der Reisekamerad band
seine Flügel an den Rücken, den Säbel aber an seine Seite, nahm
alle drei Ruten mit sich und flog nach dem Schlosse.
Es war finstere Nacht. Es stürmte so, daß die Dachsteine von den
Häusern flogen, und die Bäume drinnen im Garten, wo die Gerippe
hingen, bogen sich gleich nach dem Schilfe vor dem Sturmwinde. Es
blitzte jeden Augenblick und der Donner rollte, als ob es nur ein
einziger Schlag sei, der die ganze Nacht währte. Nun ging das
Fenster auf, und die Prinzessin flog heraus. Sie war so bleich wie der
Tod, aber sie lachte über das böse Wetter und meinte, es sei noch
nicht arg genug. Und ihr weißer Mantel wirbelte in der Luft umher,
gleich einem großen Schiffssegel, aber der Reisekamerad peitschte
sie mit seinen drei Ruten, daß das Blut auf die Erde tröpfelte und sie
zuletzt kaum weiter fliegen konnte. Endlich kam sie doch nach dem
Berge.
„Es hagelt und stürmt,“ sagte sie, „nie bin ich bei solchem Wetter
ausgewesen.“
„Man kann auch des Guten zu viel haben!“ sagte der Zauberer.
Nun erzählte sie ihm, daß Johannes auch das zweitemal richtig
geraten habe, würde er dasselbe morgen tun, so hätte er gewonnen,
und sie könne nie mehr nach dem Berge hinauskommen, vermöchte
nie mehr solche Zauberkünste wie früher zu machen, deshalb war
sie betrübt.
„Er soll es nicht erraten können!“ sagte der Zauberer. „Ich werde
schon etwas erdenken, was er sich nie gedacht hat, oder er müßte
ein größerer Zauberer gewesen sein als ich. Aber nun wollen wir
lustig sein!“ Und dann faßte er die Prinzessin bei den Händen, und
sie tanzten mit allen den kleinen Kobolden mit Irrlichtern herum, die
in dem Zimmer waren. Die roten Spinnen sprangen an den Wänden
ebenso lustig auf und nieder, es sah aus, als ob Feuerblumen
sprühten. Die Eule schlug auf die Trommel, die Heimchen pfiffen,
und die schwarzen Heuschrecken bliesen auf Mundharmonikas. Es
war ein lustiger Ball. —
Als sie nun lange genug getanzt hatten, mußte die Prinzessin nach
Hause, sonst möchte sie im Schlosse vermißt werden. Der Zauberer
sagte, daß er sie begleiten wolle, da wären sie doch unterwegs noch
beisammen.
Dann flogen sie in dem bösen Wetter davon, und der
Reisekamerad schlug seine drei Ruten auf ihrem Rücken entzwei. Nie
war der Zauberer in solchem Hagelwetter ausgewesen. Draußen vor
dem Schlosse sagte er der Prinzessin Lebewohl und flüsterte ihr
zugleich zu: „Denke an meinen Kopf!“ Aber der Reisekamerad hörte
es wohl, und gerade in dem Augenblick, als die Prinzessin durch das
Fenster in ihr Schlafgemach schlüpfte und der Zauberer wieder
umkehren wollte, ergriff er ihn an seinem langen Barte und hieb mit
dem Säbel seinen häßlichen Zaubererkopf bei den Schultern ab, so
daß der Zauberer ihn nicht einmal selbst zu sehen bekam. Den
Körper warf er hinaus in den See zu den Fischen, den Kopf aber
tauchte er nur in das Wasser und band ihn dann in sein seidenes
Taschentuch, nahm ihn mit nach dem Wirtshause und legte sich
dann schlafen.
Am nächsten Morgen gab er Johannes das Taschentuch und sagte
ihm dabei, daß er es nicht aufbinden dürfe, bevor die Prinzessin
frage, woran sie gedacht habe.
Es waren so viele Menschen in dem großen Saale auf dem
Schlosse, daß sie so dicht standen wie Radieschen, die in ein Bündel
zusammengebunden sind. Der Rat saß auf seinen Stühlen mit den
weichen Kissen, und der alte König hatte neue Kleider an, die
goldene Krone und das Zepter waren poliert: er sah feierlich aus.
Aber die Prinzessin war bleich und hatte ein schwarzes Kleid an, als
gehe sie zum Begräbnis.
„Woran habe ich gedacht?“ fragte sie den Johannes. Und sogleich
löste er das Taschentuch und war selbst erschrocken, als er das
häßliche Zaubererhaupt erblickte. Es schauderte alle Menschen,
denn es war schrecklich anzusehen, aber die Prinzessin saß da wie
ein Steinbild und konnte nicht ein einziges Wort sagen. Endlich
erhob sie sich und reichte Johannes die Hand, denn er hatte ja
richtig geraten. Sie sah weder auf den einen noch auf den andern,
sondern sie seufzte laut: „Nun bist du mein Herr! Diesen Abend
wollen wir Hochzeit halten!“
„Das gefällt mir!“ sagte der alte König. „So will ich es haben!“ Alle
Leute riefen hurra, die Wachtparade machte Musik in den Straßen,
die Glocken läuteten und die Kuchenfrauen nahmen den schwarzen
Flor von ihren Zuckermännern, denn nun herrschte große Freude.
Drei gebratene Ochsen, mit Enten und Hühnern gefüllt, wurden
mitten auf den Markt gesetzt, und jeder konnte sich ein Stück
abschneiden, in den Springbrunnen sprudelte der schönste Wein,
und kaufte man eine Pfennigbrezel beim Bäcker, so bekam man
sechs große Zwiebacke als Zugabe, und die Zwiebacke mit Rosinen
darin.
Am Abende war die ganze Stadt erleuchtet, die Soldaten schossen
mit Kanonen, die Knaben mit Knallerbsen, und es wurde gegessen
und getrunken, angestoßen und gesprungen oben im Schlosse. Alle
die vornehmen Fräulein tanzten miteinander, man konnte in weiter
Ferne hören, wie sie sangen:

Hier sind viel hübsche Mädchen,


Die gern tanzen rund herum,
Drehen sich wie Spinnerädchen;
Hübsches Mädchen, schwenk’ dich um.
Tanzt und springet immerzu,
Bis die Sohle fällt vom Schuh.

Aber die Prinzessin war ja noch eine Hexe und mochte Johannes gar
nicht leiden. Das fiel dem Reisekameraden ein, und deshalb gab er
Johannes drei Federn aus den Schwanenflügeln und eine kleine
Flasche mit einigen Tropfen darin und sagte ihm dann, daß er ein
großes Faß mit Wasser gefüllt vor das Bett der Prinzessin setzen
lassen solle, und wenn die Prinzessin hineinsteigen wolle, sollte er
ihr einen kleinen Stoß geben, so daß sie in das Wasser hinunterfalle,
wo er sie dreimal untertauchen müsse, nachdem er vorher die
Federn und die Tropfen hineingeschüttet habe, dann werde sie ihre
Zauberei verlieren und ihn recht lieb haben.
Johannes tat alles, was der Reisekamerad ihm geraten hatte. Die
Prinzessin schrie laut, als er sie unter das Wasser tauchte, und
zappelte ihm unter den Händen wie ein großer, schwarzer Schwan
mit funkelnden Augen. Als sie das zweitemal wieder über das Wasser
herauf kam, war der Schwan weiß, bis auf einen schwarzen Ring um
den Hals. Johannes betete fromm zu Gott und ließ das Wasser das
drittemal über den Vogel zusammenschlagen, und in demselben
Augenblick wurde dieser in die schönste Prinzessin verwandelt. Sie
war noch schöner als zuvor und dankte ihm mit Tränen in ihren
herrlichen Augen, daß er den Zauber von ihr gelöst habe.
Am nächsten Morgen kam der alte König mit seinem ganzen
Hofstaate, da gab es ein Gratulieren bis spät in den Tag hinein.
Zuletzt kam der Reisekamerad, er hatte seinen Stock in der Hand
und das Ränzel auf dem Rücken. Johannes küßte ihn viele Mal und
sagte, er dürfe nicht fortreisen, er solle bei ihm bleiben, denn er
wäre ja die Ursache seines Glücks. Aber der Reisekamerad schüttelte
mit dem Kopfe und sagte mild und freundlich: „Nein, nun ist meine
Zeit um. Ich habe nur meine Schuld bezahlt. Erinnerst du dich des
toten Mannes, dem die bösen Menschen Übles tun wollten? Du gabst
alles, was du besaßest, damit er Ruhe in seinem Grabe haben
konnte. Der Tote bin ich!“
In demselben Augenblicke war er verschwunden. —
Die Hochzeit währte nun einen ganzen Monat. Johannes und die
Prinzessin liebten einander innig, und der alte König erlebte manche
frohe Tage und ließ ihre kleinen Kinderchen auf seinen Knien reiten
und mit seinem Zepter spielen. Aber Johannes wurde König über das
ganze Land.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookmass.com

You might also like