Tak, możesz oczywiście współdziałać z bibliotekami Apples C. Tutaj wyjaśniono, jak to zrobić.
Zasadniczo typy C, wskaźniki C itp. Są tłumaczone na obiekty języka Swift, na przykład C int
w języku Swift to CInt
.
Zbudowałem mały przykład dla innego pytania, które może być użyte jako małe wyjaśnienie, jak połączyć C i Swift:
main.swift
import Foundation
var output: CInt = 0
getInput(&output)
println(output)
UserInput.c
#include <stdio.h>
void getInput(int *output) {
scanf("%i", output);
}
cliinput-Bridging-Header.h
void getInput(int *output);
Oto oryginalna odpowiedź.
Kompilator konwertuje C API na Swift, tak jak robi to dla Objective-C.
Zobacz Interakcja z interfejsami API Objective-C w dokumentacji.
źródło
CFTypeRef
) w stylu CoreFoundation są konwertowane na obiekty Swift. Większość funkcji ObjCRuntime.h nie ma jednak znaczenia dla języka Swift.Na wypadek, gdybyś był równie nowy w XCode jak ja i chciałbyś wypróbować fragmenty zamieszczone w odpowiedzi Leandro :
źródło
Ten post zawiera również dobre wyjaśnienie, jak to zrobić, korzystając z obsługi modułów clang .
Jest sformułowany pod kątem tego, jak to zrobić dla projektu CommonCrypto, ale ogólnie powinien działać dla każdej innej biblioteki C, z której chcesz korzystać w Swift.
Krótko eksperymentowałem z robieniem tego dla zlib. Stworzyłem nowy projekt platformy iOS i utworzyłem katalog zlib, zawierający plik module.modulemap zawierający:
Następnie w obszarze Cele -> Połącz pliki binarne z bibliotekami wybrałem dodaj elementy i dodałem libz.tbd.
W tym momencie możesz chcieć zbudować.
Byłem wtedy w stanie napisać następujący kod:
Nie musisz umieszczać nazwy biblioteki zlib na początku, z wyjątkiem powyższego przypadku, gdy nazwałem funkcję klasy Swift tak samo jak funkcję C, a bez kwalifikacji funkcja Swift jest wywoływana wielokrotnie, aż aplikacja się zatrzyma.
źródło
W przypadku C ++ pojawia się następujący błąd:
Potrzebujesz też pliku nagłówkowego C ++. Dodaj link-c do swojej funkcji, a następnie dołącz plik nagłówkowy do nagłówka mostu:
Szybki 3
UserInput.h
UserInput.c
main.swift
cliinput-Bridging-Header.h
Oto oryginalny film wyjaśniający to
źródło
__OBJC
czek do swojego nagłówka Bridging-Header, np.#ifdef __OBJC @import UIKit; #endif
Wydaje się, że to trochę inna kula wosku, gdy mamy do czynienia ze wskazówkami. Oto, co mam do tej pory do wywoływania wywołania
read
systemowego C POSIX :źródło