2016-11-04 8 views
6

스위프트 3에서 반 개방 범위 연산자 ..<Data.subdata(in:)에 사용할 수 있지만 폐쇄 범위 연산자 ...을 사용할 수없는 이유가 궁금합니다.Data.subData에서 범위 연산자 사용

나는 모든 곳에서 검색 한하지만 나에게이 오류주는 이유를 이해할 수 없다 : 아니오 '...'후보가 예상되는 상황에 맞는 결과 유형 '범위'(일명 '범위')를 생산

여기에 작동 하나 모두의 예와 일하지 않습니다 :

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 

감사합니다!

+0

귀하의 댓글이 새로운 검색에 저를지도하고 지금은 이해하고이를 읽은 후 : https://oleb.net/blog/2016/09/swift- 3-ranges /. 답을 쓰고 싶다면 기꺼이 받아 들일 것입니다. 나는 Swift와 함께 아직도 약간 녹색이다. 그래서 그들은 명백하게 나에게 뛰어 내리지 않는다! 두 연산자가 다른 종류의 "범위"를 반환했음을 알지 못했습니다. – droussel

+0

답변을 추가했습니다. :) – Hamish

답변

8
  • ..<이며 반개range operator, Range 또는 CountableRange A가합니다 (BoundIntegerStride 여부와 Strideable 여부에 따라)을 생성 할 수 있습니다. 생성되는 범위에는 하한이 포함되지만 상한은 제외됩니다.

  • ...는 (상기와 동일 조건)은 ClosedRange 또는 CountableClosedRange을 만들 수 있습니다 범위 오퍼레이터를 폐쇄한다. 생성되는 범위는 이고 모두 상한 및 하한입니다. subdata(in:) 따라서

Range<Int> 기대, 당신은 인수를 구성하기 위해 폐쇄 범위 연산자 ...를 사용할 수 없습니다 - 대신 반 개방 범위 연산자를 사용해야합니다.

그러나 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} 
+0

좋아요! 확장 기능이 포함 된 상세한 답변을 보내 주셔서 감사합니다. – droussel

+0

@droussel 기꺼이 도와 드리겠습니다. – Hamish

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} 
+3

코드 만 대답하면 비슷한 문제를 찾는 다른 사람들에게별로 도움이되지 않습니다. 이 코드가 질문에 대답하는 이유와 이미 수용된 답변 이상에 추가되는 내용을 설명하기 위해 몇 가지 메모를 추가하십시오. –