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]
就足够了。