无法订阅 swift 分机
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])
那么这里的错误是什么? P.S。谢谢你的回答:)
它不会给你 "overflow"。它给你一个超出范围的错误。只有 1 个元素的数组中没有元素索引 10。崩溃发生在您的 subscript
实现被调用之前(因为您可以通过断点轻松发现)。您无法按照您希望的方式神奇地更改现有 subscript
实现的含义。
调用的是默认的下标实现,不是你的。因此,它试图实际访问不存在的第 10 个元素。
您不能使用扩展覆盖 Array
等结构的行为。它们不是多态的。但是,您可以添加下标的新定义,如 rob 所示。
您不能以这种方式重载下标。即使可以,您也会在您的实现中创建一个无限循环。您的实施也是非法的,因为它 returns 不是 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])
这是问题所在:
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])
那么这里的错误是什么? P.S。谢谢你的回答:)
它不会给你 "overflow"。它给你一个超出范围的错误。只有 1 个元素的数组中没有元素索引 10。崩溃发生在您的 subscript
实现被调用之前(因为您可以通过断点轻松发现)。您无法按照您希望的方式神奇地更改现有 subscript
实现的含义。
调用的是默认的下标实现,不是你的。因此,它试图实际访问不存在的第 10 个元素。
您不能使用扩展覆盖 Array
等结构的行为。它们不是多态的。但是,您可以添加下标的新定义,如 rob 所示。
您不能以这种方式重载下标。即使可以,您也会在您的实现中创建一个无限循环。您的实施也是非法的,因为它 returns 不是 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])