Arrays Can';swift扩展的t下标

Arrays Can';swift扩展的t下标,arrays,swift,uint8array,Arrays,Swift,Uint8array,这就是问题所在: typealias Byte = UInt8 protocol ByteProtocol {} extension UInt8: ByteProtocol {} extension Array where Element: ByteProtocol { subscript (index: Int) -> UInt8 { return self[Int(index % self.count)] } } 即使在数学上不可能,这也会给

这就是问题所在:

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

那么这里的错误是什么?另外,谢谢您的回答:)

它不会给您带来“溢出”。它会给您一个超出范围的错误。只有1个元素的数组中没有元素索引10。崩溃发生在调用

下标
实现之前(您可以通过断点轻松发现)。您无法以希望的方式神奇地更改现有
子脚本的含义。

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

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


不能使用扩展重写结构(如
Array
)的行为。它们不是多态的。但是,您可以添加一个新的下标定义,如rob所示。

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


不能使用扩展重写结构(如
Array
)的行为。它们不是多态的。但是,您可以添加一个新的下标定义,如rob所示。

您不能以这种方式重载下标。即使可以,也会在实现中创建一个无限循环。您的实现也是非法的,因为它返回的不是
元素

你的意思是这样的:

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

您不能用这种方式重载下标。即使可以,也会在实现中创建一个无限循环。您的实现也是非法的,因为它返回的不是
元素

你的意思是这样的:

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

看看他的下标的实现。@AlexanderMomchliov它从未被调用过。他可以很容易地通过设置断点来发现这一点。是的,我知道。@matt这可能是你应该在答案中添加的关键部分:)@matt我同意这不是一个困难的问题,但如果OP理解这一点,你认为他会发布这个问题吗?看看他的下标的实现。@AlexanderMomchliov它从未被调用过。他可以很容易地通过设置断点来发现这一点。是的,我知道。@matt这可能是你应该在答案中添加的关键部分:)@matt我同意这不是一个困难的问题,但如果OP理解这一点,你认为他会发布这个问题吗?那个
Int
初始化器调用是多余的。那个
Int
初始化器调用是多余的。然后它可能是一个不受限制的扩展(where子句可能是OP前面问题的结果)次要备注:
self[index%self.count]
足够了。然后它可以是一个不受限制的扩展(where子句可能是OP前面问题的结果)次要备注:
self[索引%self.count]
就足够了。