Это может показаться странным обстоятельством, но у меня есть структуры, которые имеют массивы структур, которые иногда могут быть пустыми, но я хочу проверить, пуст ли сам массив перед его чтением (в противном случае будет получена ошибка индекса вне диапазона, как показано ниже код приведет к). Я пытаюсь выяснить наиболее интуитивный способ сделать это?
struct Item {var name: String}
struct Example {var itemArray: [Item]}
let newExample = Example(itemArray: [])
print(newExample.itemArray[0].name)
Обновлено: я просто отредактирую, а не удалю вопрос. IsEmpty определенно является вариантом, но что, если у меня есть 2 элемента в массиве, но я пытаюсь проверить, существует ли третий элемент в массиве?
Edit2: Просто вставлю код ответа для будущих читателей, особая благодарность Lokesh SN.
struct Item {
var name: String
}
struct Example {
var itemArray: [Item]
}
let newExample = Example(itemArray: [])
extension Collection {
subscript (safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil}
}
if let newItem = newExample.itemArray[safe: 0] {
print(newItem.name)
}
Если вам нужно проверить третий элемент в массиве, который может содержать меньше элементов, то проблема находится где-то еще в вашем коде/логике и не будет решена какой-то причудливой оболочкой.
Обычно я ввожу «безопасный» subscript
в расширение, которое применяется ко всем типам Collection
, например:
extension Collection {
/// Returns the element at the specified index if it is within bounds, otherwise nil.
subscript (safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
}
Это возвращает необязательный Element
, если он присутствует, а не сбой, если нет, и является IMO гораздо более выгодной сделкой.
Использование:
if let myUnwrappedElement = myCollection[safe: index] {
//Do something
}
Спасибо, это действительно тот ответ, который я искал. Я неправильно сформулировал свой первоначальный вопрос, из-за чего многие респонденты дали ответ «Пустой», но этот ответ гораздо полезнее.
О, приятно слышать!
Вероятно, это больше связано с моим плохо сформулированным вопросом, чем с вашим ответом.
if newExample.itemArray.isEmpty
?