/ / W Swift dlaczego char * staje się UnsafePointer <Int8>? - c, szybki

W Swift dlaczego char * staje się UnsafePointer <Int8>? - c, szybki

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:

  1. Dlaczego char * a UnsafePointer<Int8> w Swift? Jeśli cokolwiek bym tego oczekiwał UnsafePointer<CChar>.

  2. 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 № 1

Podobnie 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.")