Wenn ich ein Array in Swift habe und versuche, auf einen Index zuzugreifen, der außerhalb der Grenzen liegt, liegt ein nicht überraschender Laufzeitfehler vor:
var str = ["Apple", "Banana", "Coconut"]
str[0] // "Apple"
str[3] // EXC_BAD_INSTRUCTION
Ich hätte jedoch gedacht, dass es bei all der optionalen Verkettung und Sicherheit , die Swift mit sich bringt, trivial wäre, etwas zu tun wie:
let theIndex = 3
if let nonexistent = str[theIndex] { // Bounds check + Lookup
print(nonexistent)
...do other things with nonexistent...
}
Anstatt:
let theIndex = 3
if (theIndex < str.count) { // Bounds check
let nonexistent = str[theIndex] // Lookup
print(nonexistent)
...do other things with nonexistent...
}
Dies ist jedoch nicht der Fall - ich muss die alte if
Anweisung verwenden, um zu überprüfen und sicherzustellen, dass der Index kleiner als ist str.count
.
Ich habe versucht, meine eigene subscript()
Implementierung hinzuzufügen , bin mir jedoch nicht sicher, wie ich den Aufruf an die ursprüngliche Implementierung weiterleiten oder auf die Elemente zugreifen soll (indexbasiert), ohne die tiefgestellte Notation zu verwenden:
extension Array {
subscript(var index: Int) -> AnyObject? {
if index >= self.count {
NSLog("Womp!")
return nil
}
return ... // What?
}
}