2014-06-06 12 views
5

mam bibliotekę, która zawiera tę funkcję:Swift określić podwójny wskaźnik do struktury zdefiniowanej w C

void create_pointer(Pointer **pointer); 

Trwa wskaźnik wskaźnik i przydziela pamięć dla niego. w c, mogę to zrobić w ten sposób

Pointer *pointer; 
create_pointer(&pointer); 

następnie mam instancji wskaźnika.

Ale teraz chcę użyć tej funkcji w Swift. W jaki sposób?

mam żadnych szczegółów na temat Pointer, wiem tylko, że jest to struktura, zdefiniowana jak ten

typedef struct Pointer Pointer; 
+0

Nic z tego nie wydaje się być powiązane z Objective-C ani pochodzić z frameworków Apple. Swift jest warstwą nad środowiskiem wykonawczym Objective-C, więc biblioteki innych firm nie będą bezpośrednio kompatybilne. – Erik

+0

Zupełnie nie zgodziłem się, Swift jest warstwą na poziomie środowiska Objective-C, myślę, że ma własne środowisko uruchomieniowe, a wywoływanie w wielu językach jest najważniejszą cechą współczesnego języka. – galilio

+0

Swift ma komponenty, ale wszystkie wchodzą do istniejącego środowiska wykonawczego Obj-C. Zgadzam się z twoim punktem widzenia i * uwielbiam * widzieć Swifta na innych platformach, ale ... to nie nastąpi wkrótce. Aby być uczciwym, Apple już od jakiegoś czasu tworzy środowisko uruchomieniowe Obj-C. Po prostu ** frameworki **, które inni zbudowali, nie są tak dobre jak oferty Apple na Mac/iOS. – Erik

Odpowiedz

5

Zacznijmy od przykładu C

typedef struct { 
    NSUInteger someNumber; 
} SomeStruct; 

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

W C, będzie go używać tak :

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

//calling the function 
create_some_struct(&s); 

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

Jeśli wskaźnik jest typem nieprzezroczysty (np void *), trzeba użyć

var pointer: COpaquePointer = COpaquePointer.null() 

Zauważ, że Swift nie jest przeznaczony do współdziałania z kodem C łatwo. Kod C jest w większości niebezpieczny, a Swift został zaprojektowany z myślą o bezpieczeństwie, dlatego kod Swift jest nieco skomplikowany w pisaniu. Pakowarki Obj-C dla bibliotek C znacznie ułatwiają zadanie.

+0

Testuję twój kod, Xcode da mi dwa błędy, pierwszy to "withUnsafePointer": "UnsafePointer <$T1>" nie jest podtypem "()", drugi to "someStruct.memory.someNumber": "UnsafePointer ?" nie ma członka o nazwie "memory" – galilio

+0

@ user3709449 Usunąłem część 'withUnsafePointer'. To nie wydaje się konieczne. – Sulthan

+0

po usunięciu zUnsafePointer, Xcode da mi to przekonwertować wyrażenie "Void" na typ "inout UnsafePointer ?", Drugi błąd jest taki sam – galilio