What is a custom decoder in Swift's Codable system?
A custom decoder lets you control how data is read and converted into your Swift types, especially when the default decoding doesn't fit your data format.
Click to reveal answer
beginner
Why would you use custom decoder configuration?
To handle special cases like date formats, key naming differences, or nested data structures that the default decoder can't handle automatically.
Click to reveal answer
intermediate
How do you customize the date decoding strategy in JSONDecoder?
You set the dateDecodingStrategy property, for example: decoder.dateDecodingStrategy = .iso8601 to decode ISO 8601 date strings.
Click to reveal answer
intermediate
What is the role of keyDecodingStrategy in a decoder?
It controls how keys from JSON map to your Swift property names, like converting snake_case keys to camelCase properties automatically.
Click to reveal answer
advanced
How can you decode nested JSON objects with a custom decoder?
By implementing init(from decoder: Decoder) in your type and manually extracting nested containers using container.nestedContainer(keyedBy:forKey:).
Click to reveal answer
Which property of JSONDecoder lets you change how date strings are decoded?
AdateEncodingStrategy
BkeyDecodingStrategy
CdataDecodingStrategy
DdateDecodingStrategy
✗ Incorrect
The dateDecodingStrategy property controls how date strings are interpreted during decoding.
What does the keyDecodingStrategy .convertFromSnakeCase do?
AIgnores key names during decoding
BConverts camelCase keys to snake_case
CConverts snake_case keys to camelCase
DConverts keys to uppercase
✗ Incorrect
It automatically converts JSON keys written in snake_case to Swift property names in camelCase.
To decode nested JSON objects manually, which method do you use inside init(from decoder: Decoder)?
AnestedContainer(keyedBy:forKey:)
BdecodeNestedObject()
CdecodeIfPresent()
DcontainerForNested()
✗ Incorrect
nestedContainer(keyedBy:forKey:) lets you access nested JSON containers for manual decoding.
If your JSON date format is custom, how do you handle decoding?
AUse a custom DateFormatter and set it in dateDecodingStrategy
BUse default decoding only
CIgnore the date field
DConvert date to string manually after decoding
✗ Incorrect
You create a DateFormatter matching your format and assign it to dateDecodingStrategy.custom.
What is the purpose of implementing init(from decoder: Decoder) yourself?
ATo encode data manually
BTo customize how your type decodes data beyond automatic decoding
CTo create a new instance without decoding
DTo skip decoding
✗ Incorrect
Implementing init(from decoder: Decoder) lets you control decoding logic for complex or custom data.
Explain how you would configure a JSONDecoder to decode dates in a custom format and convert snake_case keys to camelCase properties.
Think about setting properties on JSONDecoder before decoding.
You got /3 concepts.
Describe the steps to decode a nested JSON object manually using a custom decoder in Swift.
Focus on how to access nested containers inside the decoder.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of using a custom decoder configuration in Swift's Decodable protocol?
easy
A. To control how data keys map to your code properties
B. To change the app's user interface colors
C. To speed up the app's launch time
D. To encrypt data before decoding
Solution
Step 1: Understand the role of custom decoding
Custom decoder configuration allows you to specify how JSON or other data keys match your Swift properties.
Step 2: Identify the purpose in data mapping
This helps fix mismatches when the data keys differ from your property names.
Final Answer:
To control how data keys map to your code properties -> Option A
Quick Check:
Custom decoding = data key mapping control [OK]
Hint: Custom decoder fixes key-property name mismatches [OK]
Common Mistakes:
Thinking it changes UI appearance
Assuming it improves app speed
Confusing decoding with encryption
2. Which of the following is the correct way to define a custom key mapping in a Swift Decodable struct?
easy
A. Declare properties as lazy var
B. Use an enum conforming to CodingKey with cases matching JSON keys
C. Override the init() method without parameters
D. Use @IBOutlet annotations on properties
Solution
Step 1: Recall how to customize keys in Decodable
Swift uses an enum conforming to CodingKey to map JSON keys to property names.
Step 2: Identify the correct syntax
The enum cases represent the JSON keys, allowing custom mapping.
Final Answer:
Use an enum conforming to CodingKey with cases matching JSON keys -> Option B
Quick Check:
Custom keys = enum CodingKey [OK]
Hint: Custom keys use enum CodingKey with cases [OK]
Common Mistakes:
Trying to override init() without parameters
Using lazy vars for decoding
Confusing UI annotations with decoding
3. Given this struct and JSON, what will be the value of userName after decoding?
struct User: Decodable {
let userName: String
enum CodingKeys: String, CodingKey {
case userName = "user_name"
}
}
let json = "{\"user_name\": \"Alice\"}".data(using: .utf8)!
medium
A. "userName"
B. Decoding error
C. nil
D. "Alice"
Solution
Step 1: Understand the custom key mapping
The JSON key "user_name" maps to the property userName via the CodingKeys enum.
Step 2: Decode the JSON data
The decoder reads "Alice" from "user_name" and assigns it to userName.
Final Answer:
"Alice" -> Option D
Quick Check:
Mapped key value = "Alice" [OK]
Hint: Check CodingKeys mapping to find decoded value [OK]
Common Mistakes:
Assuming property name must match JSON key exactly
Expecting nil if names differ
Thinking decoding fails without exact key match
4. What is wrong with this custom decoder implementation?
struct Product: Decodable {
let id: Int
let name: String
enum CodingKeys: String, CodingKey {
case id
case productName
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decode(Int.self, forKey: .id)
self.name = try container.decode(String.self, forKey: .productName)
}
}
medium
A. Missing Decodable conformance
B. Properties are not declared as optional
C. CodingKeys enum does not map 'name' property correctly
D. Decoder container is not created properly
Solution
Step 1: Check CodingKeys enum against properties
The property name expects a key, but CodingKeys has productName which does not match the property name.
Step 2: Identify the mapping issue
Since productName is not linked to name, decoding will fail or mismatch.
Final Answer:
CodingKeys enum does not map 'name' property correctly -> Option C
Quick Check:
Property-key mismatch = error [OK]
Hint: Ensure CodingKeys cases match or map all properties [OK]
Common Mistakes:
Not mapping property names to keys
Forgetting Decodable conformance
Misusing decoder container creation
5. You receive JSON data with keys "first_name" and "last_name", but your Swift struct uses firstName and lastName. How do you configure your decoder to handle this mismatch efficiently?
hard
A. Create a CodingKeys enum mapping firstName = "first_name" and lastName = "last_name"
B. Rename your struct properties to match JSON keys exactly
C. Manually parse JSON strings without using Decodable
D. Use @objc annotations on properties
Solution
Step 1: Identify the key-property name mismatch
JSON keys use snake_case, but Swift properties use camelCase.
Step 2: Use CodingKeys enum to map keys to properties
Define enum with firstName = "first_name" and lastName = "last_name" to decode correctly.
Step 3: Avoid renaming properties or manual parsing for cleaner code
This approach keeps your code clean and flexible.
Final Answer:
Create a CodingKeys enum mapping firstName = "first_name" and lastName = "last_name" -> Option A
Quick Check:
Use CodingKeys for key mapping [OK]
Hint: Map JSON keys to properties with CodingKeys enum [OK]
Common Mistakes:
Renaming properties instead of mapping keys
Parsing JSON manually instead of using Decodable
Using irrelevant annotations like @objc
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.