Swift version: 5.10
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 Get accurate app localizations in minutes using AI. Choose your languages & receive translations for 40+ markets!
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.