在Data.subdata中使用Range运算符

dro*_*sel 7 swift

在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

因此,如果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)