Type casting with as, as?, as! in Swift - Time & Space Complexity
When we use type casting in Swift, the program checks if a value can be treated as another type.
We want to know how the time it takes to do this changes as the data size grows.
Analyze the time complexity of the following code snippet.
class Animal {}
class Dog: Animal {}
let animals: [Animal] = [Dog(), Dog(), Dog(), Dog(), Dog()]
for animal in animals {
if let dog = animal as? Dog {
print("This is a dog")
}
}
This code tries to check each animal in a list to see if it is a Dog using safe type casting.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The loop goes through each element in the array.
- How many times: Once for every animal in the list.
Each animal is checked one by one, so the work grows as the list gets bigger.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 type checks |
| 100 | 100 type checks |
| 1000 | 1000 type checks |
Pattern observation: The number of checks grows directly with the number of animals.
Time Complexity: O(n)
This means the time to check all animals grows in a straight line as the list gets bigger.
[X] Wrong: "Type casting is instant and does not depend on the number of items."
[OK] Correct: Each item must be checked one by one, so more items mean more work.
Understanding how type casting scales helps you write efficient code when working with collections of mixed types.
"What if we used a dictionary to group animals by type instead of checking each one? How would the time complexity change?"
Practice
as? in Swift?Solution
Step 1: Understand
as?behavioras?tries to cast a value to a different type and returns an optional, which is nil if the cast fails.Step 2: Compare with other casting operators
as!force casts and crashes if it fails, whileasis for guaranteed casts like upcasting.Final Answer:
as?attempts a cast and returns an optional value. -> Option BQuick Check:
as?= optional cast [OK]
as? returns optional, safe cast [OK]- Confusing
as?with force castas! - Thinking
as?always succeeds - Using
as?for guaranteed casts
value to type String?Solution
Step 1: Identify force cast syntax
Force casting usesas!to convert a value to a type, crashing if it fails.Step 2: Check each option
let str = value as! String usesas!correctly. let str = value as? String is safe cast, B and C are invalid syntax.Final Answer:
let str = value as! String -> Option AQuick Check:
Force cast =as![OK]
as! with exclamation mark [OK]- Using
as?when force cast is needed - Writing invalid syntax like
as String! - Confusing optional cast with force cast
class Animal {}
class Dog: Animal {}
let animal: Animal = Dog()
if let dog = animal as? Dog {
print("It's a dog")
} else {
print("Not a dog")
}Solution
Step 1: Understand the class hierarchy and casting
Dog is a subclass of Animal. The variable animal holds a Dog instance but typed as Animal.Step 2: Use safe cast
Theas?to check typeif letsafely casts animal to Dog. Since animal is actually a Dog, cast succeeds.Final Answer:
It's a dog -> Option AQuick Check:
Safe cast success prints "It's a dog" [OK]
as? returns non-nil if type matches [OK]- Assuming cast fails because variable type is superclass
- Confusing
aswithas? - Expecting runtime crash without force cast
let value: Any = "Hello" let number = value as! Int print(number)What is the issue with this code?
Solution
Step 1: Analyze the force cast operation
The variablevalueholds a String "Hello" but is force cast to Int usingas!.Step 2: Understand force cast failure
Since "Hello" cannot be cast to Int, the force cast crashes at runtime.Final Answer:
It will cause a runtime crash due to invalid force cast. -> Option DQuick Check:
Force cast invalid type = crash [OK]
- Expecting print output instead of crash
- Thinking force cast returns nil on failure
- Confusing
as!with safe castas?
Any containing mixed types: ["Swift", 42, 3.14, "Code"]. You want to create a new array containing only the strings by safely casting each element. Which code snippet correctly does this using as??Solution
Step 1: Understand the goal and methods
We want only strings from a mixed array, safely casting each element.Step 2: Analyze each option
let strings = mixedArray.compactMap { $0 as? String } usescompactMapwith safe castas?, which filters out nils and unwraps strings correctly. let strings = mixedArray.map { $0 as! String } force casts and may crash. let strings = mixedArray.filter { $0 as? String != nil } filters but keeps original types, not strings. let strings = mixedArray.map { $0 as? String } maps to optionals, resulting in array of optionals, not strings.Final Answer:
let strings = mixedArray.compactMap { $0 as? String } -> Option CQuick Check:
Safe cast + compactMap filters and unwraps [OK]
as? to filter and unwrap safely [OK]- Using map with force cast causing crashes
- Using filter without unwrapping optionals
- Expecting map with
as?to unwrap optionals
Ready to prove it?
Pass the test and this pattern moves unknown
