0

这就是问题:

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谢谢你的回答:)

4

3 回答 3

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])
于 2016-11-20T17:39:27.193 回答
1

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

于 2016-11-20T17:36:13.180 回答
0

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

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

于 2016-11-20T17:37:55.600 回答