Swift version: 5.6
Swift likes to be safe, but one problematic area can be reading from arrays and dictionaries. In the case of dictionaries, reading a missing key will return nil
rather than the value you might have expected, but in the case of arrays it’s worse: your app will crash.
Dictionaries have a special subscript method that can send back a default value if you request a missing key, but arrays don’t. Fortunately, we can fix that using Swift’s extensions:
extension Array {
public subscript(index: Int, default defaultValue: @autoclosure () -> Element) -> Element {
guard index >= 0, index < endIndex else {
return defaultValue()
}
return self[index]
}
}
That uses @autoclosure()
so your default value can be calculated however you need without incurring a performance hit in times when you use a valid array index.
With that extension in place you can now create and use arrays as usual:
var names = ["Paul"]
let paul = names[0]
But if you want, you can now also read any index using the new subscript and be sure to get back a safe value:
let anon1 = names[-1, default: "Anonymous"]
let anon2 = names[1, default: "Anonymous"]
let anon3 = names[556, default: "Anonymous"]
Alternatively, you could write a safeIndex
subscript that returns an optional value – nil
if the index is out of bounds, or the value in question otherwise:
extension Array {
public subscript(safeIndex index: Int) -> Element? {
guard index >= 0, index < endIndex else {
return nil
}
return self[index]
}
}
Both solutions have their uses, so try experimenting and see which works best for you.
SPONSORED Play is the first native iOS design tool created for designers and engineers. You can install Play for iOS and iPad today and sign up to check out the Beta of our macOS app with SwiftUI code export. We're also hiring engineers!
Sponsor Hacking with Swift and reach the world's largest Swift community!
Available from iOS 8.0
This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.
Link copied to your pasteboard.