这是问题所在:
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])
那么这里的错误是什么?附:谢谢你的回答:)
答案 0 :(得分:5)
你不能以这种方式过载下标。即使你可以,你也会在你的实现中创建一个无限循环。您的实现也是非法的,因为它返回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 :(得分:1)
它没有给你一个"溢出"。它会给你一个超出范围的错误。在只有1个元素的数组中没有元素索引10。崩溃发生在您调用subscript
实现之前(因为您可以通过破坏它来轻松发现)。您无法以您希望的方式神奇地改变现有subscript
实现的含义。
答案 2 :(得分:0)
调用下标的默认实现,而不是你的。因此,它试图实际访问不存在的第10个元素。
您无法使用扩展程序覆盖Array
等结构的行为。他们不是多态的。但是,您可以添加下标的新定义,如rob所示。