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