Якщо у мене є масив у Swift, і я намагаюся отримати доступ до індексу, який знаходиться поза межами, виникає не дивна помилка виконання:
var str = ["Apple", "Banana", "Coconut"]
str[0] // "Apple"
str[3] // EXC_BAD_INSTRUCTION
Однак я б подумав, що з усіма необов'язковими ланцюжками та безпекою, які приносить Свіфт, було б тривіально зробити щось на кшталт:
let theIndex = 3
if let nonexistent = str[theIndex] { // Bounds check + Lookup
print(nonexistent)
...do other things with nonexistent...
}
Замість:
let theIndex = 3
if (theIndex < str.count) { // Bounds check
let nonexistent = str[theIndex] // Lookup
print(nonexistent)
...do other things with nonexistent...
}
Але це не так - я повинен використовувати if
оператор ol ', щоб перевірити і переконатися, що індекс менший за str.count
.
Я спробував додати власну subscript()
реалізацію, але я не впевнений, як передати дзвінок до оригінальної реалізації чи отримати доступ до елементів (на основі індексу), не використовуючи позначення підписки:
extension Array {
subscript(var index: Int) -> AnyObject? {
if index >= self.count {
NSLog("Womp!")
return nil
}
return ... // What?
}
}