2016-07-11 4 views
3

나는 다음 열거 한 : 나는 NSData로 변환하려면 다음 코드를 사용신속한 enum 바이트 표현이란 무엇입니까?

enum Enum: UInt8 
{ 
    case A = 0x00 
    case B = 0x01 
    case C = 0x10 
} 

: 나는 0x10은, 그러나, 그것은 0x02이 포함되어 포함 data

var value = Enum.C 
let data = NSData(bytes: &value, length: 1) 

를 당연히 기대.

Enum.A의 경우 0x00을 포함하고 Enum.B의 경우 0x01을 포함합니다.

내게는 실제 원시 데이터 대신 값의 인덱스를 저장하는 것처럼 보입니다. 누군가이 행동을 설명 할 수 있을까요?

P. rawValue을 사용하면 완벽하게 작동합니다. 그러나 그것 때문에 NSData 값을 변환하는 제네릭 함수를 만들 수 없기 때문에 뒤에 이유를 이해하고 싶습니다.

+0

를 정확히 ** 1 ** (I는'대신 sizeof' 사용'1') . 따라서 저장된 유일한 것은 주문 번호입니다. – Werolik

답변

3

때문에 신속한 ABI는 아직 진행 중이며 (고정 된 것으로 예상 됨) th 스위프트 4). 열거 형은 메모리 is described here에 표시됩니다.

열거 : IS가 있기 때문에

귀하의 경우는

  • 두 개 이상의 경우
  • 전혀 관련 값

ABI의 문서를 인용 ... "c-like enum"입니다 모든 경우를 포함하는 최소 비트 수의 정수 태그로 배치됩니다. [...] 사례에는 선언 순서에 따라 태그 값이 지정됩니다.

여기서 중요한 정보는 "최소 비트 수"입니다. 이것은 (귀하의 경우) 인스턴스가 2 비트로 들어 맞아야 함을 의미합니다 (3 가지 경우). rawValue 0x10은 ABI와 충돌하는 5 비트가 필요합니다.

컴파일러는 아마도 정적 테이블을 사용하여 EnumrawValue (및 그 이후) 인스턴스로 변환합니다.여기

는 ABI의 특성을 강조하는 예이다 :이 경우, 바이트의 값의 크기를

enum Enum: UInt32 
{ 
    case A = 0 
    case B = 0xffffffff // value that does not fit into one byte 
} 

assert(sizeof(Enum.self) == 1) 
+0

감사합니다. 열거 형을 NSData로 변환하기 위해 특정 'RawValueRepresentable' 오버로드를 사용해야 할 것 같습니다. – Werolik

+0

@Werolik ABI 사양에 의존하지 말고 지금 당장 일반 변환 기능을 구축하는 것이 좋습니다. –

1

각 enum의 경우 표준 주문 값이 지정됩니다. .rawValue을 사용하지 않을 때 얻는 결과는 무엇입니까? 당신이 당신의 열거를 변경하는 경우 예를 들어

: 3 될 것

var value = Enum.C 
let data = NSData(bytes: &value, length: 1) 

data을 실행할 때, 그리고

enum Enum: UInt8 
{ 
    case A = 0x00 
    case B = 0x01 
    case B2 = 0x0A 
    case C = 0x10 
} 

, A = 0, B = 1, B2 = 2, C = 3

+1

이 문제에 대한 문서를 참조 할 수 있습니까? – Werolik