2015-05-24 4 views
5

Ist es möglich, eine Swift-Klasse in C void * pointer umzuwandeln?Ist es möglich, eine Swift-Klasse in C void * pointer umzuwandeln?

// swift class 
class MyClass { 

} 

var myClass = MyClass() 
var p: UnsafeMutablePointer<Void> = myClass //<- failed 

//c function 
void someSwiftClass(void *context); 

Dank

+2

diese Frage keinen Sinn macht. a void * ist nur eine Speicheradresse ohne Annahme, was an dieser Speicheradresse ist. Sie können einen beliebigen Zeiger auf eine void * -Anweisung setzen, aber es gibt keine Konvertierung, da void kein Formular hat, in das konvertiert werden kann. – Rob

Antwort

3

ich ähnliches Problem hatte, können Sie dies wie unten konvertieren.

var myClass = MyClass() 

var classPtr = unsafeBitCast(myClass, UnsafePointer<Void>.self)  

und Ihre Funktion,

func someSwiftClass(voidPointer: UnsafeMutablePointer<Void>) { 

} 

Wenn Sie UnsafePointer<T> konstanten Zeiger Verwendung deklarieren möchten und wenn Sie den Mauszeiger nicht konstant Verwendung UnsafeMutablePointer<T>

In C konstanten Zeiger - const int *myCpointer

Entsprechender schneller Zeiger - let mySwiftPointer: UnsafePointer<Int32>

+0

Vielen Dank. aber "void someSwiftClass" ist C-Funktion Format und "(voidPointer: UnsafeMutablePointer )" ist schnelle Funktion Format – CocoaUser

+0

Ja, änderte es :) – Amit89

1

Dies funktioniert:

var p: UnsafeMutablePointer<Void> = 
    UnsafeMutablePointer(Unmanaged.passUnretained(myClass).toOpaque()) 
+0

Danke. Das funktioniert für mich (soweit), wo ich eine schnelle Klasse nicht statische Methode aus einem C++ - Thread über Objective C mit dispatch_async (dispatch_get_main_queue(), ...) aufruft. – user3717478

0

Ich habe einige Tests durchgeführt unter Verwendung von Swift 2. Das Verhalten in Swift 2 verschieden sein kann als in früheren Versionen Swift war, aber hier ist das, was ich gefunden habe.

Die von Amit89 und newacct vorgeschlagenen Lösungen werden kompiliert, aber es kann zu Problemen bei der Verwendung der Instanz von MyClass in C-Code kommen. So etwas wie dieses

someSwiftClass(&myClass) 

wird auch gut kompilieren, aber mit dem gleichen Problem.

Ich weiß nicht den Kontext der ursprünglichen Frage, aber lassen Sie mich raten, dass der C-Code etwas mit dem void * an someSwiftClass() übergeben wird, so gibt es eine Instanz eines C-Typs, der der Zeiger ist angenommen, um darauf zu zeigen. Wie meine Erfahrung zeigt, ist es in diesem Fall sicherer, den C-Datentyp, höchstwahrscheinlich eine Struktur, in Swift zu importieren und entweder diesen importierten Typ in Ihrem Swift-Code zu verwenden oder eine Wrapper-Swift-Klasse/Struktur zu verwenden. Sie können den Wrapper so schreiben, dass er einen UnsafeMutablePointer umschließt. In diesem Fall werden die Änderungen an den Daten in Swift-Code in C!

Bitte beachten Sie, diese Frage für weitere Informationen: Swift converts C's uint64_t different than it uses its own UInt64 type

Ich habe auch einen Blog-Post, die Ihnen nützlich sein könnten: http://www.swiftprogrammer.info/callback_void.html

Verwandte Themen