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.
BUILD THE ULTIMATE PORTFOLIO APP Most Swift tutorials help you solve one specific problem, but in my Ultimate Portfolio App series I show you how to get all the best practices into a single app: architecture, testing, performance, accessibility, localization, project organization, and so much more, all while building a SwiftUI app that works on iOS, macOS and watchOS.
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.