在Swift 3中,我想知道为什么我能够使用Data.subdata(in:)中的半开放范围运算符..<
,而不是封闭范围运算符...
。
我到处搜索但无法理解为什么它会给我这个错误: no&#39; ...&#39;候选人产生预期的上下文结果类型 &#39;范围&#39; (又名&#39;范围&#39;)
这是一个有效的例子和一个没有的例子:
import Foundation
let x = Data(bytes: [0x0, 0x1])
let y : UInt8 = x.subdata(in: 0..<2).withUnsafeBytes{$0.pointee}
let z : UInt8 = x.subdata(in: 0...1).withUnsafeBytes{$0.pointee} // This fails
谢谢!
答案 0 :(得分:13)
..<
是半开 range operator,可以创建Range
或CountableRange
(取决于是否Bound
Strideable
Integer
Stride
是Range<Int>
。创建的范围包括下限,但不包括上限。
...
是已关闭的范围运算符,可以创建ClosedRange
或CountableClosedRange
(与上述要求相同)。创建的范围包括 的上限和下限。
因此,当subdata(in:)
期望...
时,您不能使用闭区域运算符Data
来构造参数 - 您必须使用半开范围运算符。
但是,扩展ClosedRange<Int>
并添加一个接受extension Data {
func subdata(in range: ClosedRange<Index>) -> Data {
return subdata(in: range.lowerBound ..< range.upperBound + 1)
}
}
的重载将是微不足道的,这将允许您使用闭区域运算符。
let x = Data(bytes: [0x0, 0x1])
let z : UInt8 = x.subdata(in: 0...1).withUnsafeBytes {$0.pointee}
的
{{1}}
答案 1 :(得分:0)
import Foundation
let x = Data(bytes: [0x0, 0x1])
let y : UInt8 = x.subdata(in: Range(0..<2)).withUnsafeBytes{$0.pointee}
let z : UInt8 = x.subdata(in: Range(0...1)).withUnsafeBytes{$0.pointee}