2014-06-06 13 views
5

Ho una biblioteca che contiene questa funzione:Swift definire doppio della puntatore struct definito in c

void create_pointer(Pointer **pointer); 

Prende puntatore di un puntatore e alloca memoria per esso. in C, io posso farlo in questo modo

Pointer *pointer; 
create_pointer(&pointer); 

poi ho istanza di un puntatore.

Ma ora voglio usare questa funzione in Swift. Come?

Non ho dettagli su Pointer, so solo che è una struttura, definita come questo

typedef struct Pointer Pointer; 
+0

Nessuno di questi sembra essere legato all'Obiettivo-C o proveniente da framework Apple. Swift è un livello in cima al runtime Objective-C, quindi le librerie di terze parti non saranno direttamente compatibili. – Erik

+0

Non è affatto d'accordo, Swift è un livello in cima al runtime Objective-C, penso che abbia il proprio runtime, e la chiamata attraverso la lingua è la caratteristica più importante del linguaggio moderno. – galilio

+0

Swift ha componenti ma tutti si collegano al runtime Obj-C esistente. Sono d'accordo con il tuo punto e vorrei * amare * vedere Swift su altre piattaforme ma ... non succederà presto. Per essere onesti, Apple ha reso l'open source runtime Obj-C per un po 'di tempo. È solo che i ** framework ** che altri hanno costruito non sono abbastanza buoni come quelli offerti da Apple su Mac/iOS. – Erik

risposta

5

Cominciamo con un esempio C

typedef struct { 
    NSUInteger someNumber; 
} SomeStruct; 

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

In C, si usa in questo modo :

//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:

Se il puntatore è un tipo opaco (per esempio void *), è necessario utilizzare

var pointer: COpaquePointer = COpaquePointer.null() 

Nota che Swift non è progettato per interagire con il codice C con facilità. Il codice C è per lo più pericoloso e Swift è progettato per la sicurezza, ecco perché il codice Swift è un po 'complicato da scrivere. I wrapper Obj-C per le librerie C rendono il compito molto più semplice.

+0

Verifica il tuo codice, Xcode mi dà due errori, prima è 'withUnsafePointer': 'UnsafePointer <$T1>' non è un sottotipo di '()', il secondo è 'someStruct.memory.someNumber': 'UnsafePointer ?' non ha un membro chiamato 'memoria' – galilio

+0

@ user3709449 Ho rimosso la parte 'withUnsafePointer'. Non sembra necessario. – Sulthan

+0

dopo rimuove withUnsafePointer, Xcode darmi questo convertire il tipo di espressione 'Vuoto' digitare 'inout UnsafePointer ?', Il secondo errore è lo stesso – galilio

Problemi correlati