2014-06-06 10 views
5

I haben eine Bibliothek, die diese Funktion enthält:Swift definieren Doppelzeiger für struct in C definiert

void create_pointer(Pointer **pointer); 

es ein Zeiger des Zeigers nimmt und weist Speicher dafür. in c kann ich es so machen

Pointer *pointer; 
create_pointer(&pointer); 

dann habe ich eine Zeigerinstanz.

Aber jetzt möchte ich diese Funktion in Swift verwenden. Wie?

Ich habe keine Informationen über Pointer, ich weiß nur, es ist eine Struktur, wie diese

definiert
typedef struct Pointer Pointer; 
+0

Keine davon scheint Objective-C verwandt zu sein oder aus den Frameworks von Apple zu stammen. Swift ist eine Schicht über der Objective-C-Laufzeit, sodass Bibliotheken von Drittanbietern nicht direkt kompatibel sind. – Erik

+0

Ganz und gar nicht einverstanden, Swift ist eine Ebene über der Objective-C-Laufzeit, ich denke, es hat eine eigene Laufzeit und Call-over-Language ist das wichtigste Merkmal der modernen Sprache. – galilio

+0

Swift hat Komponenten, aber alle greifen auf die bestehende Obj-C-Laufzeit zu. Ich stimme deinem Standpunkt zu und würde Swift gerne auf anderen Plattformen sehen, aber ... das passiert nicht bald. Um fair zu sein, Apple hat die Obj-C-Laufzeit seit einiger Zeit Open Source. Es ist nur so, dass die ** Frameworks **, die andere entwickelt haben, nicht ganz so gut sind wie die Angebote von Apple auf Mac/iOS. – Erik

Antwort

5

die mit einem C Beispiel

typedef struct { 
    NSUInteger someNumber; 
} SomeStruct; 

void create_some_struct(SomeStruct **someStruct) { 
    *someStruct = malloc(sizeof(SomeStruct)); 
    (*someStruct)->someNumber = 20; 
} 

In C Lassen Sie beginnen, würden Sie es wie folgt verwenden :

//pointer to our struct, initially empty 
SomeStruct *s = NULL; 

//calling the function 
create_some_struct(&s); 

In Swift:

//declaring a pointer is simple 
var s: UnsafePointer<SomeStruct> = UnsafePointer<SomeStruct>.null() 

//well, this seems to be almost the same thing :) 
create_some_struct(&s) 

println("Number: \(s.memory.someNumber)"); //prints 20 

Edit:

Wenn Ihr Zeiger ist eine undurchsichtige Art (z void *), haben Sie

var pointer: COpaquePointer = COpaquePointer.null() 

Hinweis zu bedienen, dass Swift ist nicht leicht mit C-Code zusammenzuwirken. C-Code ist meist unsicher und Swift ist auf Sicherheit ausgelegt, weshalb der Swift-Code ein wenig kompliziert zu schreiben ist. Obj-C-Wrapper für C-Bibliotheken erleichtern die Aufgabe erheblich.

+0

Ich teste Ihren Code, Xcode gibt mir zwei Fehler, zuerst ist 'withUnsafePointer': 'UnsafePointer <$T1>' ist kein Untertyp von '()', zweitens ist 'someStruct.memory.someNumber': 'UnsafePointer ?' hat kein Mitglied mit dem Namen "Speicher" – galilio

+0

@ user3709449 Ich habe den 'withUnsafePointer' Teil entfernt. Es scheint nicht notwendig zu sein. – Sulthan

+0

nach dem Entfernen mitUnsafePointer, Xcode geben Sie mir dies konvertieren den Ausdruck Typ "Void" auf "inout UnsafePointer ?", Der zweite Fehler ist der gleiche – galilio