在Data.subdata

时间:2016-11-04 20:26:40

标签: swift

在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

谢谢!

2 个答案:

答案 0 :(得分:13)

因此,当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}