无法订阅 swift 分机

Can't Subscript from swift extension

这是问题所在:

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])

那么这里的错误是什么? P.S。谢谢你的回答:)

它不会给你 "overflow"。它给你一个超出范围的错误。只有 1 个元素的数组中没有元素索引 10。崩溃发生在您的 subscript 实现被调用之前(因为您可以通过断点轻松发现)。您无法按照您希望的方式神奇地更改现有 subscript 实现的含义。

调用的是默认的下标实现,不是你的。因此,它试图实际访问不存在的第 10 个元素。

您不能使用扩展覆盖 Array 等结构的行为。它们不是多态的。但是,您可以添加下标的新定义,如 rob 所示。

您不能以这种方式重载下标。即使可以,您也会在您的实现中创建一个无限循环。您的实施也是非法的,因为它 returns 不是 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])