无法通过swift extension

时间:2016-11-20 17:32:06

标签: 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)]
    }

}

即使在数学上不可能,这也会让我溢出:

var p: [Byte] = [Byte]()
p.append(15)
print(p[10])

那么这里的错误是什么?附:谢谢你的回答:)

3 个答案:

答案 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所示。