Bird
Raised Fist0
Swiftprogramming~10 mins

Opaque types with some keyword in Swift - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Opaque types with some keyword
Define function returning some Protocol
↓
Function hides concrete type
↓
Caller gets value typed as Protocol
↓
Use returned value via Protocol interface
↓
Concrete type remains hidden
The function returns a value conforming to a protocol but hides the exact type using 'some'. The caller sees only the protocol interface.
Execution Sample
Swift
protocol Shape {
    func area() -> Double
}

func makeCircle() -> some Shape {
    struct Circle: Shape {
        var radius: Double
        func area() -> Double { 3.14 * radius * radius }
    }
    return Circle(radius: 5)
}
Defines a function returning an opaque type conforming to Shape protocol, hiding the concrete Circle type.
Execution Table
StepActionEvaluationResult
1Call makeCircle()Create Circle(radius: 5)Circle instance created
2Return Circle as some ShapeHide concrete typeReturn value typed as some Shape
3Caller receives valueType is some ShapeCan call area() but not access Circle-specific properties
4Call area() on returned valueCompute 3.14 * 5 * 5Returns 78.5
5EndNo more stepsExecution stops
💡 Function returns opaque type; caller uses protocol interface without knowing concrete type
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
circlenilCircle(radius: 5)Hidden as some Shapesome Shape valuesome Shape value with area()=78.5
Key Moments - 2 Insights
Why can't the caller access Circle's radius property?
Because the function returns 'some Shape', the concrete Circle type is hidden. The caller only knows the value conforms to Shape, so only protocol methods like area() are accessible (see execution_table step 3).
Is the concrete type created each time the function is called?
Yes, each call creates a new Circle instance internally (execution_table step 1), but the caller only sees it as some Shape.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the type of the value returned by makeCircle() at step 2?
Asome Shape
BCircle
CShape protocol
DAny
💡 Hint
See execution_table row 2: the concrete type is hidden and returned as some Shape.
At which step does the caller call the area() method on the returned value?
AStep 1
BStep 2
CStep 4
DStep 3
💡 Hint
Check execution_table row 4: area() is called on the opaque type.
If the function returned Shape instead of some Shape, what would change in the execution?
ACaller could access Circle's radius
BCaller would get a protocol existential instead of opaque type
CFunction would return concrete Circle type
DNo difference
💡 Hint
Opaque types hide concrete type; returning protocol type returns existential (concept explanation).
Concept Snapshot
Use 'some Protocol' to return an opaque type.
The concrete type is hidden from the caller.
Caller sees only the protocol interface.
Allows type safety with abstraction.
Example: func f() -> some Shape { ... }
Full Transcript
This example shows how a Swift function can return an opaque type using the 'some' keyword. The function makeCircle() creates a concrete Circle instance internally but returns it as 'some Shape', hiding the concrete type. The caller receives a value typed as some Shape and can call protocol methods like area(), but cannot access Circle-specific properties like radius. The execution table traces the steps: creating the Circle, returning it as some Shape, the caller receiving it, and calling area(). This helps beginners understand how opaque types provide abstraction while preserving type safety.

Practice

(1/5)
1. What does the some keyword do when used in a Swift function's return type?
easy
A. It forces the function to return a specific concrete type.
B. It hides the exact return type but guarantees it conforms to a protocol.
C. It makes the function return any type without restrictions.
D. It allows the function to return multiple different types at runtime.

Solution

  1. Step 1: Understand the purpose of some keyword

    The some keyword in Swift is used to declare an opaque return type, which means the exact type is hidden but it must conform to a specified protocol.
  2. Step 2: Compare with other options

    The other options describe behaviors that do not match the opaque type concept: forcing a concrete type, returning any type freely, or allowing multiple types at runtime.
  3. Final Answer:

    It hides the exact return type but guarantees it conforms to a protocol. -> Option B
  4. Quick Check:

    Opaque types = hidden concrete type with protocol conformance [OK]
Hint: Remember: some hides type but keeps protocol rules [OK]
Common Mistakes:
  • Thinking some allows any return type without constraints
  • Confusing some with generics
  • Believing some returns multiple types dynamically
2. Which of the following is the correct syntax to declare a function returning an opaque type conforming to View protocol?
easy
A. func makeView() -> some View { Text("Hello") }
B. func makeView() -> any View { Text("Hello") }
C. func makeView() -> View { Text("Hello") }
D. func makeView() -> some View() { Text("Hello") }

Solution

  1. Step 1: Identify correct syntax for opaque return type

    The correct syntax uses some followed by the protocol name without parentheses: -> some View.
  2. Step 2: Check each option

    func makeView() -> some View { Text("Hello") } matches the correct syntax. func makeView() -> any View { Text("Hello") } uses any which is for existential types, not opaque. func makeView() -> View { Text("Hello") } returns the protocol type directly, which is not allowed. func makeView() -> some View() { Text("Hello") } incorrectly adds parentheses after View.
  3. Final Answer:

    func makeView() -> some View { Text("Hello") } -> Option A
  4. Quick Check:

    Opaque type syntax = -> some Protocol [OK]
Hint: Use some without parentheses for opaque types [OK]
Common Mistakes:
  • Using any instead of some for opaque types
  • Adding parentheses after protocol name
  • Returning protocol type directly instead of opaque type
3. What will be the output of this Swift code?
protocol Shape {
    func area() -> Double
}

struct Circle: Shape {
    var radius: Double
    func area() -> Double { 3.14 * radius * radius }
}

func makeShape() -> some Shape {
    Circle(radius: 2)
}

print(makeShape().area())
medium
A. 0.0
B. 4.0
C. 12.56
D. Error: Cannot use 'some' here

Solution

  1. Step 1: Understand the code flow

    The function makeShape() returns an opaque type conforming to Shape, specifically a Circle with radius 2.
  2. Step 2: Calculate the area

    The area of the circle is calculated as 3.14 * 2 * 2 = 12.56.
  3. Final Answer:

    12.56 -> Option C
  4. Quick Check:

    Circle area = π * r² = 12.56 [OK]
Hint: Calculate area using radius 2 and π=3.14 [OK]
Common Mistakes:
  • Confusing some with errors in return type
  • Using wrong formula for area
  • Assuming runtime error due to opaque type
4. Identify the error in this Swift code using opaque types:
protocol Animal {
    func sound() -> String
}

struct Dog: Animal {
    func sound() -> String { "Bark" }
}

struct Cat: Animal {
    func sound() -> String { "Meow" }
}

func makeAnimal(_ type: String) -> some Animal {
    if type == "dog" {
        return Dog()
    } else {
        return Cat()
    }
}
medium
A. Function returns different concrete types violating opaque type rules.
B. Missing protocol conformance in structs.
C. Incorrect function return type syntax.
D. No error; code is correct.

Solution

  1. Step 1: Understand opaque type restrictions

    Functions returning some Protocol must always return the same concrete type, even if hidden.
  2. Step 2: Analyze the function's return paths

    This function returns Dog or Cat depending on input, which breaks the opaque type rule.
  3. Final Answer:

    Function returns different concrete types violating opaque type rules. -> Option A
  4. Quick Check:

    Opaque type = single hidden type only [OK]
Hint: Opaque return must be one concrete type, not multiple [OK]
Common Mistakes:
  • Returning different types for opaque return
  • Confusing opaque types with protocol types
  • Ignoring compiler error about inconsistent return types
5. You want to write a function that returns an opaque type conforming to Collection protocol, but the collection should be filtered to only even numbers from an input array. Which of these implementations correctly uses some keyword and returns the filtered collection?
hard
A. func evenNumbers(from numbers: [Int]) -> some Collection { return numbers.sorted() }
B. func evenNumbers(from numbers: [Int]) -> some Collection { return numbers.map { $0 * 2 } }
C. func evenNumbers(from numbers: [Int]) -> [Int] { numbers.filter { $0 % 2 == 0 } }
D. func evenNumbers(from numbers: [Int]) -> some Collection { numbers.filter { $0 % 2 == 0 } }

Solution

  1. Step 1: Understand the requirement

    The function must return an opaque type conforming to Collection that contains only even numbers filtered from the input.
  2. Step 2: Evaluate each option

    func evenNumbers(from numbers: [Int]) -> some Collection { numbers.filter { $0 % 2 == 0 } } returns the filtered array using filter, which is a Collection and matches the requirement with some Collection. func evenNumbers(from numbers: [Int]) -> some Collection { return numbers.map { $0 * 2 } } returns doubled numbers, not filtered evens. func evenNumbers(from numbers: [Int]) -> [Int] { numbers.filter { $0 % 2 == 0 } } returns a concrete array type, not opaque. func evenNumbers(from numbers: [Int]) -> some Collection { return numbers.sorted() } returns sorted numbers but not filtered evens.
  3. Final Answer:

    func evenNumbers(from numbers: [Int]) -> some Collection { numbers.filter { $0 % 2 == 0 } } -> Option D
  4. Quick Check:

    Filter evens + opaque return = func evenNumbers(from numbers: [Int]) -> some Collection { numbers.filter { $0 % 2 == 0 } } [OK]
Hint: Use filter and some Collection for opaque filtered result [OK]
Common Mistakes:
  • Returning wrong filtered or mapped collection
  • Returning concrete type instead of opaque
  • Not filtering for even numbers
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard