2017-05-12 3 views
0

)。私はSwiftの初心者で、古いプログラムをSwift3に変換しようとしています。 。'NSRange'(aka'_NSRange ')型の値を期待される引数型' Range <Data.Index> 'に変換できません(別名Range' <int>

Cannot convert value of type 'NSRange'(aka'_NSRange') to expected argument type 'Range<Data.Index>' (aka 'Range<int>')

:エラーの束を修正するために管理が、私はこの機能を動作させることはできません

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 

}

ここにきましたが、私が取得エラーです

このエラーに関する質問はたくさんありますが、解決策の実装に成功していません。どのように進むべきかに関するヒント?

ありがとうございました!

答えて

3

範囲は、同時に複雑で簡単です。

subdata(in: start..<end)を入力すると、必要なタイプのRange<Int>になります。ただし、この場合startendは、範囲と範囲の先頭と末尾のインデックスを参照します。これは、渡したときの位置と長さではなく、NSMakeRange()です。

+0

おかげでたくさん! – TGCBraun

2

@jrturtonは、すでに述べたように、subdata(in:)Range<Int>引数をとり、 は、それはあなたのケースで

originalEntitlementsData = originalEntitlementsData.subdata(in: i..<i+end) 

をする必要があります。しかしNSDataへのすべての変換は、あなたがDataの既存range(of:)方法を利用 場合 は.bytes、明示的なループとmemcmpが必要とされていない取っていることに注意してください:

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) 
} 
+0

ありがとうございます! – TGCBraun

関連する問題