2015-05-07 2 views
3

Вы можете построить UnsafePointer из целого, как:Как получить исходный двоичный двоичный паттерн с небезопасного указателя Swift?

let ptr = UnsafePointer<Void>(bitPattern: 123) 

Но как вы получите, что число двоичных разрядов (в данном случае 123) назад от указателя?

Зачем вам это нужно?

(Добавлено в ответ на некоторые комментарии, которые предположили, что я не использую указатели правильно.)

Это не то, что вы обычно делаете, и выше указатель на самом деле не указатель на что-нибудь. Если программа разыменовала его, это сработает.

Некоторые API уровня низкого уровня используют void * для обозначения некоторых произвольных данных. Это версия C общих типов. Например, представьте себе структуру стека данных в C, с API, как

Stack *create_stack(); 
void stack_push(Stack *stack, void *element); 
void *stack_pop(Stack *stack); 

Обычно вы бы передавать указатели в куче данных, но позволяет сказать, что вы просто хотите стек 64-разрядных целых чисел, и вы знаете, что указатели на вашей системе - 64 бит. Вы можете хранить целые числа непосредственно в стеке, и избежать выделения кучи ...

Stack *myStack = create_stack(); 
long elt = 123; 
stack_push(myStack, (void*)elt); 
... 
elt = (long)stack_pop(myStack); 

Я имею дело с API, как это, но более сложные (для полигонов тесселяции).

ответ

2

Я нашел ответ на другом форуме. Использовать unsafeBitCast:

let ptr = UnsafePointer<Void>(bitPattern: 123) 
let x: Int64 = unsafeBitCast(ptr, Int64.self) 
// x == 123 
Смежные вопросы