📖 Scenario: You are building a simple system where different parts of your app can talk to each other safely and clearly, even if they run on different devices or threads. This is like having different team members working on the same project but in different rooms, and they need a clear way to send messages to each other.
🎯 Goal: Create a basic distributed actor in Swift that can receive a greeting message and respond with a greeting reply. This will help you understand how distributed actors work and how to define their behavior.
📋 What You'll Learn
Create a distributed actor named Greeter
Add a distributed function greet(name: String) async throws -> String that returns a greeting message
Create an instance of Greeter
Call the greet function with a name and print the returned greeting
💡 Why This Matters
🌍 Real World
Distributed actors help build apps where parts run on different devices or threads but still communicate safely and clearly, like chat apps or multiplayer games.
💼 Career
Understanding distributed actors is useful for Swift developers working on scalable, concurrent, or networked applications that require safe communication between components.
Progress0 / 4 steps
1
Create the distributed actor
Write a distributed actor named Greeter with no properties or functions yet.
Swift
Hint
Use the keyword distributed actor followed by the name Greeter.
2
Add a distributed greet function
Inside the Greeter distributed actor, add a distributed function named greet that takes a String parameter called name and returns a String. The function should be async throws and return the greeting message "Hello, \(name)!".
Swift
Hint
Remember to mark the function as distributed, async, and throws. Use string interpolation to create the greeting.
3
Create an instance of Greeter
Create a constant named greeter and assign it a new instance of the Greeter distributed actor.
Swift
Hint
Use let greeter = Greeter() to create the instance.
4
Call greet and print the result
Call the greet function on the greeter instance with the argument "Alice". Use Task to run async code and print the returned greeting message.
Swift
Hint
Use Task { ... } to run async code. Call try await greeter.greet(name: "Alice") and print the result.
Practice
(1/5)
1. What is the main purpose of a distributed actor in Swift?
easy
A. To define a class that cannot be used with concurrency
B. To create a local-only actor with no network communication
C. To allow an actor to work across multiple computers easily
D. To replace all functions with synchronous calls
Solution
Step 1: Understand the role of distributed actors
Distributed actors are designed to work across different machines, enabling remote communication.
Step 2: Compare options with the concept
Only To allow an actor to work across multiple computers easily correctly describes this purpose; others describe unrelated or incorrect features.
Final Answer:
To allow an actor to work across multiple computers easily -> Option C
Quick Check:
Distributed actor purpose = cross-computer use [OK]
Hint: Distributed actors enable remote work across computers [OK]
Common Mistakes:
Thinking distributed actors are local-only
Confusing distributed actors with regular classes
Assuming distributed actors disable concurrency
2. Which of the following is the correct way to declare a distributed function inside a distributed actor?
easy
A. func fetchData() async throws -> String
B. func distributed fetchData() async throws -> String
C. distributed func fetchData() -> String
D. distributed func fetchData() async throws -> String
Solution
Step 1: Recall distributed function syntax
Distributed functions inside distributed actors use the keyword distributed func and are usually async and throwable.
distributed func fetchData() async throws -> String -> Option D
Quick Check:
Distributed function syntax = distributed func [OK]
Hint: Use 'distributed func' keyword for remote calls [OK]
Common Mistakes:
Omitting 'distributed' keyword
Placing 'distributed' after 'func'
Forgetting async or throws in distributed funcs
3. Given the code below, what will be printed when calling await greeter.sayHello()?
distributed actor Greeter {
distributed func sayHello() async -> String {
return "Hello from distributed actor!"
}
}
let greeter = Greeter()
Task {
let message = await greeter.sayHello()
print(message)
}
medium
A. Error: distributed actor cannot be instantiated directly
B. Hello from distributed actor!
C. Hello from local actor!
D. Runtime error due to missing network connection
Solution
Step 1: Understand distributed actor instantiation
Distributed actors can be instantiated locally for testing or local use, so Greeter() is valid here.
Step 2: Analyze the distributed function call
The sayHello() function returns the string "Hello from distributed actor!" asynchronously, so the print will output this string.
Final Answer:
Hello from distributed actor! -> Option B
Quick Check:
Distributed func returns greeting string [OK]
Hint: Distributed actors can be called locally for testing [OK]
Common Mistakes:
Assuming distributed actors cannot be instantiated locally
Expecting network errors without remote setup
Confusing distributed actor with local-only actor
4. Identify the error in the following distributed actor code:
distributed actor Counter {
var count = 0
distributed func increment() {
count += 1
}
}
medium
A. Distributed functions must be async and throwable
B. Distributed actors cannot have mutable state
C. The distributed func must return a value
D. The count variable must be declared as distributed
Solution
Step 1: Check distributed function requirements
Distributed functions must be declared as async and can throw errors because they involve remote calls.
Step 2: Analyze the given function
The increment() function is missing async and throws keywords, which is a syntax error for distributed functions.
Final Answer:
Distributed functions must be async and throwable -> Option A
Quick Check:
Distributed func requires async and throws [OK]
Hint: Always add async and throws to distributed funcs [OK]
Common Mistakes:
Forgetting async keyword in distributed funcs
Assuming distributed funcs can be synchronous
Thinking distributed actors disallow mutable vars
5. You want to build a distributed chat app using Swift's distributed actors. Which approach correctly uses distributed actors and functions to send a message to a remote user?
hard
A. Define a distributed actor ChatUser with a distributed func sendMessage(_ message: String) that can be called remotely.
B. Use a regular class with async functions and manually handle network communication.
C. Define a distributed actor but use non-distributed functions for sending messages.
D. Use global functions with no actors to send messages asynchronously.
Solution
Step 1: Understand distributed actors for remote communication
Distributed actors are designed to simplify remote calls, so defining a ChatUser as a distributed actor with distributed functions fits the use case.
Step 2: Evaluate options for remote message sending
Define a distributed actor ChatUser with a distributed func sendMessage(_ message: String) that can be called remotely. correctly uses distributed actors and distributed functions for remote calls. Options B, C, and D either ignore distributed actors or misuse function types, making remote communication harder or incorrect.
Final Answer:
Define a distributed actor ChatUser with a distributed func sendMessage(_ message: String) that can be called remotely. -> Option A