Swift 无法转换类型为';NSRange';(aka';u NSRange';)到预期的参数类型';范围<;数据索引>';(又名&x27;范围<;内部>;

Swift 无法转换类型为';NSRange';(aka';u NSRange';)到预期的参数类型';范围<;数据索引>';(又名&x27;范围<;内部>;,swift,swift3,Swift,Swift3,我是Swift的初学者,正在尝试将一个较旧的程序转换为Swift3。我已经设法修复了一系列错误,但我无法让这个函数工作 fileprivate func extractEntitlements(_ entitlementData: Data) -> NSDictionary? { var originalEntitlementsData = entitlementData let xmlStart = "<?xml".data(using: String.Encoding.a

我是Swift的初学者,正在尝试将一个较旧的程序转换为Swift3。我已经设法修复了一系列错误,但我无法让这个函数工作

fileprivate func extractEntitlements(_ entitlementData: Data) -> NSDictionary? {
  var originalEntitlementsData = entitlementData
  let xmlStart = "<?xml".data(using: String.Encoding.ascii, allowLossyConversion: true)
  let bytes = (originalEntitlementsData as NSData).bytes
  for i in 0...(originalEntitlementsData.count - xmlStart!.count) {
     if memcmp((xmlStart! as NSData).bytes, bytes + i, Int(xmlStart!.count)) == 0 {
        let end = originalEntitlementsData.count - i
        **originalEntitlementsData = originalEntitlementsData.subdata(in: NSMakeRange(i, end))**
        break;
     }
  }

  return NSString(data: originalEntitlementsData, encoding: String.Encoding.ascii.rawValue)?.propertyList() as? NSDictionary
fileprivate func提取权限(uu-authoritmentdata:Data)->NSDictionary{
var originalentlementsdata=权利数据

让xmlStart=“范围在swift中同时更加复杂和简单


您需要
subdata(in:start..,正如@jrturton已经说过的,
subdata(in:)
接受一个
Range
参数, 应该如此

originalEntitlementsData = originalEntitlementsData.subdata(in: i..<i+end)
var originalEntitlementsData = entitlementData
let xmlStart = "<?xml".data(using: .utf8)!
if let range = originalEntitlementsData.range(of: xmlStart) {
    originalEntitlementsData = originalEntitlementsData.subdata(in: range.lowerBound..<originalEntitlementsData.endIndex)
   // Alternatively:
   // originalEntitlementsData.removeSubrange(0..<range.lowerBound)
}