2017-05-12 1 views
0

'라고 함). 저는 Swift에서 초보자이며 이전 프로그램을 Swift3으로 변환하려고합니다. 했습니다 오류의 무리를 해결하기 위해 관리하지만이 기능은 동작하지 않습니다'NSRange'(aka'_NSRange ') 유형의 값을 예상 인수 유형'Range <Data.Index> '으로 변환 할 수 없습니다 (범위'<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 

가} 여기

은 내가 오류입니다.

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

이 오류와 관련하여 많은 질문이 있지만 솔루션을 성공적으로 구현하지 못했습니다. 내가 어떻게 진행해야하는지에 대한 조언?

고마워요!

답변

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

관련 문제