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 Take the pain out of configuring and testing your paywalls. RevenueCat's all new Paywall Editor allow you to remotely configure your paywall view without any code changes or app updates.
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.