Не могу подписаться от быстрого расширения
Это проблема:
typealias Byte = UInt8
protocol ByteProtocol {}
extension UInt8: ByteProtocol {}
extension Array where Element: ByteProtocol {
subscript (index: Int) -> UInt8 {
return self[Int(index % self.count)]
}
}
Это дает мне переполнение, даже если это математически невозможно:
var p: [Byte] = [Byte]()
p.append(15)
print(p[10])
Так в чем здесь ошибка? PS Спасибо за ответ:)
3 ответа
Вы не можете перегружать подписки таким образом. Даже если бы вы могли, вы бы создали бесконечный цикл в вашей реализации. Ваша реализация также была бы незаконной, так как она возвращает что-то другое Element
,
Что вы имеете в виду, что-то вроде этого:
extension Array where Element: ByteProtocol {
subscript (wrapping index: Int) -> Element {
return self[Int(index % self.count)]
}
}
var p: [Byte] = [Byte]()
p.append(15)
print(p[wrapping: 10])
Это не дает вам "переполнение". Это дает вам ошибку вне диапазона. В массиве, содержащем только 1 элемент, отсутствует индекс элемента 10. Авария происходит до вашего subscript
реализация всегда вызывается (как вы могли бы легко обнаружить, указав точку останова). Вы не можете волшебным образом изменить значение существующего subscript
реализация так, как вы надеетесь.
Реализация индекса по умолчанию называется, а не ваша. Следовательно, он пытается получить доступ к 10-му элементу, который не существует.
Вы не можете переопределить поведение структуры, как Array
используя расширение. Они не полиморфны. Однако вы можете добавить новое определение индекса, как показал Роб.