2016-05-31 1 views
1

В C, это действительно имеет точку указатель на ячейку памяти, выделенной для указателя:точка UnsafeMutablePointer <Void> к себе

static void * SomeContext = &SomeContext; 

Я видел это используется в базы кода Objective-C с КВО с помощью этот указатель как context в observeValueForKeyPath:ofObject:change:context:.

Можно ли указать указатель на пространство памяти, выделенное для этого указателя в Swift, или вручную выделить память для указателя? Попытка указать указатель на значение памяти само по себе во время инициализации вызывает ошибку (как и ожидалось):

var somePointer: UnsafeMutablePointer<Void> = &somePointer // Error: Variable used within its own initial value 

CMutableVoidPointer не существует в языке больше, и инициализирует указатель (UnsafeMutablePointer<Void>()) является устаревшим и только наборы указатель на nil.

Может быть что-то вроде:

var ptr = malloc(sizeof(UnsafeMutablePointer<Void>)) 
ptr = &ptr // Error: error: cannot assign value of type 'inout UnsafeMutablePointer<Void>' (aka 'inout UnsafeMutablePointer<()>') to type 'UnsafeMutablePointer<Void>' (aka 'UnsafeMutablePointer<()>') 
+0

Что именно вы пытаетесь достичь? – Alexander

+0

@AMomchilov Как бы вы написали 'static void * SomeContext = & SomeContext;' в Swift. Это не часть более серьезной проблемы, я просто пытаюсь понять, как C-указатели перешли на работу Swift. – JAL

+1

Я должен был знать, что вы ответили на такой вопрос, спасибо @MartinR. – JAL

ответ

3

На Swift 3:

var somePointer = UnsafeMutableRawPointer(bitPattern: 1)! 
somePointer = UnsafeMutableRawPointer(mutating: &somePointer) 

print(somePointer) 
print(somePointer.load(as: UnsafeMutableRawPointer.self)) 
// Output of both should be the same. 

Swift 2:

Use withUnsafePointer, чтобы получить указатель на переменную. Затем назначьте это самому себе.

var somePointer: UnsafeMutablePointer<Void> = nil 
withUnsafePointer(&somePointer) { somePointer = UnsafeMutablePointer($0) }