Bird
Raised Fist0
Swiftprogramming~5 mins

Limitations and best practices in Swift - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a common limitation when using Swift's automatic reference counting (ARC)?
ARC can cause retain cycles if two objects hold strong references to each other, leading to memory leaks.
Click to reveal answer
beginner
Why should you avoid force unwrapping optionals in Swift?
Force unwrapping can cause runtime crashes if the optional is nil. It's safer to use optional binding or optional chaining.
Click to reveal answer
intermediate
What is a best practice when working with concurrency in Swift?
Use structured concurrency with async/await and avoid shared mutable state to prevent race conditions and improve code clarity.
Click to reveal answer
intermediate
What limitation does Swift have regarding dynamic dispatch for structs and enums?
Structs and enums use static dispatch by default, so you cannot override methods or use polymorphism like with classes.
Click to reveal answer
beginner
Why is it recommended to use value types (structs) over reference types (classes) when possible in Swift?
Value types provide safer code by avoiding shared mutable state and making data easier to reason about, improving performance and thread safety.
Click to reveal answer
What can cause a retain cycle in Swift's ARC system?
AUsing value types instead of reference types
BUsing optional binding
CTwo objects holding strong references to each other
DUsing async/await
Which is the safest way to access an optional value in Swift?
AForce unwrapping with !
BUsing a forced cast
CIgnoring the optional
DOptional binding with if let
What is a recommended practice when writing concurrent Swift code?
AUse structured concurrency and avoid shared mutable state
BAvoid async/await
CUse shared mutable state freely
DUse global variables for data sharing
Which Swift types use static dispatch by default?
AClasses
BStructs and enums
CProtocols
DClosures
Why prefer value types over reference types in Swift when possible?
AThey avoid shared mutable state and improve thread safety
BThey are slower but safer
CThey allow inheritance
DThey use dynamic dispatch
Explain the main limitation of Swift's ARC and how to avoid it.
Think about how two objects can keep each other alive unintentionally.
You got /4 concepts.
    Describe best practices for safely handling optionals and concurrency in Swift.
    Focus on safety and clarity in your code.
    You got /5 concepts.

      Practice

      (1/5)
      1. Which of the following is a known limitation of Swift as a programming language?
      easy
      A. Swift does not support multiple inheritance for classes.
      B. Swift cannot use functions.
      C. Swift does not allow variables.
      D. Swift cannot perform arithmetic operations.

      Solution

      1. Step 1: Understand Swift class inheritance

        Swift allows classes to inherit from only one superclass, so multiple inheritance is not supported.
      2. Step 2: Evaluate other options

        Swift supports functions, variables, and arithmetic operations fully, so options B, C, and D are incorrect.
      3. Final Answer:

        Swift does not support multiple inheritance for classes. -> Option A
      4. Quick Check:

        Multiple inheritance = Not supported [OK]
      Hint: Remember: Swift classes have single inheritance only [OK]
      Common Mistakes:
      • Thinking Swift supports multiple inheritance like some other languages
      • Confusing protocol inheritance with class inheritance
      • Assuming Swift lacks basic features like functions or variables
      2. Which of the following is the correct way to safely unwrap an optional in Swift?
      easy
      A. optionalValue = value
      B. print(optionalValue!)
      C. optionalValue = nil
      D. if let value = optionalValue { print(value) }

      Solution

      1. Step 1: Identify safe optional unwrapping

        Using 'if let' safely unwraps an optional only if it contains a value.
      2. Step 2: Check other options

        print(optionalValue!) force unwraps and can crash if nil; C and D are assignments, not unwrapping.
      3. Final Answer:

        if let value = optionalValue { print(value) } -> Option D
      4. Quick Check:

        Safe unwrapping = if let [OK]
      Hint: Use 'if let' to unwrap optionals safely [OK]
      Common Mistakes:
      • Using force unwrap (!) without checking for nil
      • Confusing assignment with unwrapping
      • Ignoring optional safety and risking runtime crashes
      3. What will be the output of the following Swift code?
      let numbers = [1, 2, 3, 4]
      let doubled = numbers.map { $0 * 2 }
      print(doubled)
      medium
      A. Error: map is not a function
      B. [1, 2, 3, 4]
      C. [2, 4, 6, 8]
      D. [4, 8, 12, 16]

      Solution

      1. Step 1: Understand the map function

        The map function applies the closure to each element, multiplying each by 2.
      2. Step 2: Calculate the result

        Each number doubles: 1*2=2, 2*2=4, 3*2=6, 4*2=8, so the array is [2, 4, 6, 8].
      3. Final Answer:

        [2, 4, 6, 8] -> Option C
      4. Quick Check:

        map doubles each element = [2, 4, 6, 8] [OK]
      Hint: Remember map transforms each element in the array [OK]
      Common Mistakes:
      • Thinking map modifies the original array
      • Confusing map with filter or reduce
      • Expecting an error due to misunderstanding map
      4. Identify the error in the following Swift code snippet:
      var name: String?
      print(name.count)
      medium
      A. The 'count' property does not exist for String.
      B. Optional value 'name' must be unwrapped before accessing 'count'.
      C. Variable 'name' cannot be declared as optional.
      D. print statement syntax is incorrect.

      Solution

      1. Step 1: Analyze optional usage

        'name' is an optional String, so accessing 'count' directly is unsafe and causes an error.
      2. Step 2: Understand Swift optional rules

        You must unwrap 'name' safely before accessing its properties to avoid runtime errors.
      3. Final Answer:

        Optional value 'name' must be unwrapped before accessing 'count'. -> Option B
      4. Quick Check:

        Access optional property = unwrap first [OK]
      Hint: Always unwrap optionals before accessing their properties [OK]
      Common Mistakes:
      • Trying to access properties on optionals directly
      • Ignoring the need for safe unwrapping
      • Assuming optional variables behave like normal variables
      5. You want to create a dictionary from an array of names where keys are names and values are the length of each name, but only include names longer than 3 characters. Which Swift code snippet follows best practices and limitations correctly?
      hard
      A. let names = ["Amy", "John", "Kate"] let dict = Dictionary(uniqueKeysWithValues: names.filter { $0.count > 3 }.map { ($0, $0.count) })
      B. let names = ["Amy", "John", "Kate"] let dict = Dictionary(uniqueKeysWithValues: names.map { ($0, $0.count) })
      C. let names = ["Amy", "John", "Kate"] var dict = [String: Int]() for name in names { dict[name] = name.count }
      D. let names = ["Amy", "John", "Kate"] let dict = names.reduce(into: [:]) { $0[$1] = $1.count }

      Solution

      1. Step 1: Understand the requirement

        We need a dictionary with names longer than 3 characters as keys and their lengths as values.
      2. Step 2: Analyze each option

        let names = ["Amy", "John", "Kate"] let dict = Dictionary(uniqueKeysWithValues: names.map { ($0, $0.count) }) includes all names, ignoring length filter. let names = ["Amy", "John", "Kate"] var dict = [String: Int]() for name in names { dict[name] = name.count } declares dict as var (mutable), but does not filter names. let names = ["Amy", "John", "Kate"] let dict = names.reduce(into: [:]) { $0[$1] = $1.count } includes all names without filtering. let names = ["Amy", "John", "Kate"] let dict = Dictionary(uniqueKeysWithValues: names.filter { $0.count > 3 }.map { ($0, $0.count) }) filters names with count > 3 before mapping to dictionary, following best practice and limitation.
      3. Final Answer:

        let names = ["Amy", "John", "Kate"] let dict = Dictionary(uniqueKeysWithValues: names.filter { $0.count > 3 }.map { ($0, $0.count) }) -> Option A
      4. Quick Check:

        Filter then map to dictionary = let names = ["Amy", "John", "Kate"] let dict = Dictionary(uniqueKeysWithValues: names.filter { $0.count > 3 }.map { ($0, $0.count) }) [OK]
      Hint: Filter first, then map to dictionary for clean code [OK]
      Common Mistakes:
      • Not filtering names before creating dictionary
      • Using mutable dictionary without filtering
      • Ignoring best practice of chaining filter and map
      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