繁体   English   中英

无法快速扩展下标

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

那么这是什么错误呢? PS谢谢您的回答:)

您不能以这种方式重载下标。 即使可以,您仍将在实现中创建一个无限循环。 您的实现也将是非法的,因为它返回的不是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个元素的数组中没有元素索引10。 崩溃发生在调用subscript实现之前(因为您可以通过断点轻松发现它)。 您无法以您希望的方式神奇地更改现有subscript实现的含义。

下标的默认实现称为,而不是您的。 因此,它试图实际访问第十个元素,该元素不存在。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM