Dodałem pliki zawierające klasy Objective-Cz innego projektu do mojego projektu Swift. W jednej z tych klas Obj-C znajduje się element danych o nazwie "decodedBuffer" typu char *. Nie jestem dobrze zorientowany w C, ale myślałem, że wskaźnik znaku był sposobem C reprezentowania ciągu. Kiedy próbuję uzyskać ten element danych w moim kodzie Swift, na przykład pisząc następujący wiersz
myObjCClass.decodedBuffer = "a new value"
Dostaję komunikat o błędzie mówiąc, że dekodowany Buffer jest typu UnsafePointer<Int8>
. Mam więc dwa pytania:
Dlaczego char * a
UnsafePointer<Int8>
w Swift? Jeśli cokolwiek bym tego oczekiwałUnsafePointer<CChar>
.Jak mam pracować z tą wartością w Swift? Biblioteka, której używam, jest w pewnym sensie czarną skrzynką, a także całkowicie w Objective-C, więc nie jestem w 100% przetwarzana przez dane, które przekazuję, przypisując wartość do zdekodowanego Buffera. Wszelkie wskazówki dotyczące interfejsu z obiektami C w Swift? Tak, czytałem część "Dokumentów Swift z interfejsem" Interacting with C ", ale chciałbym, aby jakaś mądrość zyskała na interfejsie C API, jeśli to możliwe.
Odpowiedzi:
1 dla odpowiedzi № 1Podobnie jak Swift, w C możesz zadeklarować zmienne zmienne (zmienne) lub niezmienne (let).
Twoja biblioteka C przekazuje ci an UnsafePointer<Int8>
= niezmienna wartość.
Jednym ze sposobów uzyskania dostępu do kodu C jest możliwość zmiany wartości zmiennej. Wtedy możesz sobie poradzić z: UnsafeMutablePointer = zmienną wartością.
Twoje drugie pytanie o to, dlaczego jest ono reprezentowanejako typ <Int8> dostaje się do sedna wskaźników w C. Nie przekazujesz ciągów danych do różnych lokalizacji pamięci Przekazujesz wskaźnik Wskaźnik wskazuje na lokalizację pamięci pierwszego znaku tablicy znaków (np. ciąg) przechowywany w pamięci. O wiele bardziej wydajny.
Przykład Swift pokazujący wartość int wskaźnika C:
let greeting: String = "Hello World."
let greetingPointer = strdup(greeting) // UnsafeMutablePointer<Int8>?
print("I am your (greetingPointer). I point to memory location of Greeting.")