在Swift 3中,我想知道为什么我能够..<在Data.subdata(in :)中使用半开放范围运算符,而不是封闭范围运算符....
我到处搜索但是无法理解为什么它给了我这个错误: 没有'...'候选人产生预期的上下文结果类型'Range'(又名'Range')
这是一个有效的例子和一个没有的例子:
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
Run Code Online (Sandbox Code Playgroud)
谢谢!
Ham*_*ish 13
..<是半开 范围运算符,它可以创建一个Range或CountableRange(取决于是否Bound是Strideable与Integer Stride或没有).创建的范围包括下限,但不包括上限.
...是闭区域运算符,可以创建一个ClosedRange或CountableClosedRange(与上面相同的要求).所创建的范围是包括性的两者的上限和下限.
因此,如果subdata(in:)需要a Range<Int>,则不能使用闭区域运算符...来构造参数 - 您必须使用半开区域运算符.
但是,扩展Data和添加一个接受a的重载将是微不足道的ClosedRange<Int>,这将允许您使用闭合范围运算符.
extension Data {
func subdata(in range: ClosedRange<Index>) -> Data {
return subdata(in: range.lowerBound ..< range.upperBound + 1)
}
}
Run Code Online (Sandbox Code Playgroud)
let x = Data(bytes: [0x0, 0x1])
let z : UInt8 = x.subdata(in: 0...1).withUnsafeBytes {$0.pointee}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7260 次 |
| 最近记录: |