Subscript защита для индекса вне диапазона


#1

subscript : хочу что бы чего нить принтовалось если индекс out of range , и происходил возврат пустого массива, не судите строго, я только учусь))) и это домашка

struct Paper {
var studentName:String
var topic:String
}

class StackOfPapers {
var paperArray:[Paper] = []

func push(paper:inout Paper) {
paperArray.append(paper)
}
func pop() {
paperArray.removeLast()
}
subscript (index:Int) -> [Paper]? {
get {
var new = [Paper]()
for i in 0...index {
//походу защита не работает
if i > paperArray.count || i < 0 {
print("i не может быть больше \(paperArray.count)")
return nil
}
else {
new.append(paperArray[i])
}
}
return new
}
set {
var newArray = [Paper]()
for i in 0...index {
//походу защита не работает
guard i == paperArray.count else {break}
newArray.append(paperArray[i])
}
}
}
func about() {
print(paperArray)
}
}

#2

Ну тогда можно что-то такое попробовать:

let isValidIndex = array.indices.contains(index)

if !isValidIndex {
    print("Index is out of range")
    array = []
}

#3

Как тебе такой getter:
get {
var new = Paper

     //Здесь проверяем на валидность индекса
     guard index <= paperArray.count && index >= 0 else {
        print("Индекс больше чем кол-во элементов в paperArray")
        return []
     }
     
     //Здесь мы знаем, что индекс подходит, и просто добавляем элементы
     for i in 0..<index {
        new.append(paperArray[i])
     }
     
     //Возвращаем новый массив элементов
     return new
  }

Про сеттер ничего сказать не могу, т.к. не знаю, какой функционал ты хочешь ему дать)


#4

Выглядит не плохо))), буду проверять!

Про сеттер, честно говоря, я его как то интуитивно там прописал, даже не понимаю, нафиг он в этом случае нужен, но без него не работал метод

func   about() {
        print(paperArray)

вынес метод выше, стал работать без сеттера, да и код в сеттере, на мой взгляд, какой то дикий))), хоть я его и писал, но … в итоге сеттер выглядит вот так

set {
            for _ in 0...index - 1 {
                paperArray = newValue

функционал такой же как и был, но теперь хоть понятно чего в нем происходит


#5

в index - 1 видится какая-то магия. Все можно сделать однозначнее для понимания -
``for _ in 0…<index {```


Закрыл тему #6