Bird
Raised Fist0
Swiftprogramming~5 mins

Generic subscripts in Swift - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a generic subscript in Swift?
A generic subscript allows you to define a subscript that can work with any type, using a placeholder type parameter. This makes the subscript flexible and reusable for different data types.
Click to reveal answer
beginner
How do you declare a generic subscript in Swift?
You declare a generic subscript by adding a generic type parameter in angle brackets <> after the subscript keyword, like:
subscript<T>(index: Int) -> T { ... }
Click to reveal answer
intermediate
Why use generic subscripts instead of regular subscripts?
Generic subscripts let you write one subscript that works with many types, reducing code duplication and increasing flexibility. Regular subscripts work with fixed types only.
Click to reveal answer
intermediate
Can a generic subscript have multiple generic parameters?
Yes, a generic subscript can have multiple generic parameters, just like generic functions. For example:
subscript(key: T) -> U { ... }
Click to reveal answer
beginner
Give a simple example of a generic subscript in Swift.
Example:<br><code>struct Box {<br>  private var items = [Any]()<br>  subscript<T>(index: Int) -> T? {<br>    get { items[index] as? T }<br>    set { if let newValue = newValue { items[index] = newValue } }<br>  }<br>}</code><br>This subscript can get or set items of any type safely.
Click to reveal answer
What does the <T> mean in a generic subscript declaration in Swift?
AIt limits the subscript to only Int types.
BIt declares a placeholder type that can be any type.
CIt specifies the subscript returns a tuple.
DIt is a syntax error in Swift.
Can a generic subscript return different types depending on the caller?
AYes, the caller decides the type by specifying it.
BNo, the return type is fixed.
COnly if the subscript is static.
DOnly if the subscript uses Int as generic type.
Which keyword is used to define a subscript in Swift?
Afunc
Bindex
Csubscript
Dget
Is it possible to have a generic subscript with constraints on the generic type?
AYes, you can add constraints like <T: Equatable>.
BNo, generic subscripts cannot have constraints.
COnly for classes, not structs.
DOnly if the subscript is private.
What happens if you try to access a generic subscript with a type that does not match the stored data?
AIt causes a compile-time error.
BIt automatically converts the type.
CIt always returns a default value.
DIt returns nil if optional or causes a runtime error.
Explain what a generic subscript is and why it is useful in Swift.
Think about how generics help functions work with many types.
You got /3 concepts.
    Write a simple Swift struct with a generic subscript that stores and retrieves values of any type.
    Use an array of Any and cast inside the subscript.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main benefit of using generic subscripts in Swift?
      easy
      A. They allow subscripts to accept different types as keys or indexes.
      B. They make subscripts run faster by using fixed types only.
      C. They restrict subscripts to only integer indexes.
      D. They automatically convert all keys to strings.

      Solution

      1. Step 1: Understand generic subscripts purpose

        Generic subscripts let you write one subscript that works with many types of keys or indexes.
      2. Step 2: Compare options with this purpose

        Only They allow subscripts to accept different types as keys or indexes. correctly states that generic subscripts accept different types as keys or indexes.
      3. Final Answer:

        They allow subscripts to accept different types as keys or indexes. -> Option A
      4. Quick Check:

        Generic subscripts = flexible key types [OK]
      Hint: Generic subscripts = flexible keys/indexes [OK]
      Common Mistakes:
      • Thinking generic subscripts improve speed
      • Assuming subscripts only accept integers
      • Believing keys auto-convert to strings
      2. Which of the following is the correct syntax to declare a generic subscript in Swift?
      easy
      A. subscript(index: T) -> String { get }
      B. func subscript<T>(index: T) -> String { get }
      C. subscript<T>(index: Int) -> T { get }
      D. subscript<T>(index: T) -> String { get }

      Solution

      1. Step 1: Recall generic subscript syntax

        Generic subscripts use subscript<T>(index: T) -> ReturnType syntax.
      2. Step 2: Check each option

        subscript<T>(index: T) -> String { get } matches the correct syntax. func subscript<T>(index: T) -> String { get } wrongly uses func. subscript(index: T) -> String { get } misses generic parameter declaration. subscript<T>(index: Int) -> T { get } has mismatched types.
      3. Final Answer:

        subscript<T>(index: T) -> String { get } -> Option D
      4. Quick Check:

        Generic subscript syntax = subscript<T> [OK]
      Hint: Generic subscript uses subscript<T>(index: T) syntax [OK]
      Common Mistakes:
      • Using func instead of subscript
      • Omitting generic parameter <T>
      • Mismatching parameter and return types
      3. What will be the output of this Swift code?
      struct Box {
          private var values = [String: Any]()
          subscript<T>(key: String) -> T? {
              get { values[key] as? T }
              set { values[key] = newValue }
          }
      }
      
      var box = Box()
      box["age"] = 30
      box["name"] = "Alice"
      print(box["age"] as Int?, box["name"] as String?)
      medium
      A. Optional(30) Optional("Alice")
      B. 30 Alice
      C. nil nil
      D. Compilation error

      Solution

      1. Step 1: Understand subscript behavior

        The subscript stores values in a dictionary with String keys and Any values, casting on get.
      2. Step 2: Analyze stored values and prints

        "age" stores 30 (Int), "name" stores "Alice" (String). The print casts them back to Int? and String?, so output shows optionals.
      3. Final Answer:

        Optional(30) Optional("Alice") -> Option A
      4. Quick Check:

        Generic subscript returns optional cast values [OK]
      Hint: Generic subscript returns optional cast values [OK]
      Common Mistakes:
      • Expecting non-optional output
      • Confusing dictionary storage with direct types
      • Assuming compilation error due to Any type
      4. Identify the error in this generic subscript code and choose the fix:
      struct Container {
          private var data = [Int: String]()
          subscript<T>(key: T) -> String? {
              get { data[key] }
              set { data[key] = newValue }
          }
      }
      medium
      A. Change dictionary to [T: String] to match generic key type.
      B. Add type constraint to subscript declaration.
      C. Change subscript to subscript(key: Int) -> String? to match dictionary key type.
      D. No error; code works as is.

      Solution

      1. Step 1: Check dictionary key type vs subscript key type

        Dictionary keys are Int, but subscript uses generic T which can be any type.
      2. Step 2: Identify mismatch causing error

        Accessing data[key] fails because key is T, not necessarily Int. Fix is to restrict subscript key to Int.
      3. Final Answer:

        Change subscript to subscript(key: Int) -> String? to match dictionary key type. -> Option C
      4. Quick Check:

        Subscript key type must match dictionary key type [OK]
      Hint: Subscript key type must match dictionary key type [OK]
      Common Mistakes:
      • Assuming generic T works without constraints
      • Trying to change dictionary type without reason
      • Ignoring type mismatch errors
      5. Given a struct that stores values with keys of any Hashable type, how can you implement a generic subscript to safely get and set values?
      Choose the best approach.
      hard
      A. Use separate dictionaries for each key type and switch inside the subscript.
      B. Use a dictionary with keys of type AnyHashable and cast keys inside the subscript.
      C. Use a dictionary with keys of type String only and convert all keys to String.
      D. Use a generic dictionary [T: Any] without constraints and force cast keys.

      Solution

      1. Step 1: Understand requirement for any Hashable key

        To store values with keys of any Hashable type, use a dictionary with keys of type AnyHashable.
      2. Step 2: Implement generic subscript with safe casting

        Use generic subscript with key of type T: Hashable, convert key to AnyHashable for dictionary access, ensuring type safety.
      3. Final Answer:

        Use a dictionary with keys of type AnyHashable and cast keys inside the subscript. -> Option B
      4. Quick Check:

        AnyHashable dictionary + generic subscript = safe flexible keys [OK]
      Hint: Use AnyHashable keys for flexible generic subscripts [OK]
      Common Mistakes:
      • Using multiple dictionaries instead of one
      • Converting all keys to String losing type info
      • Force casting keys causing runtime errors
      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